go與c互相呼叫

2022-03-12 15:40:57 字數 1933 閱讀 3090

此例子來自於go原始碼中,藉此來和大家分享一下兩者如何呼叫,網上很多文章語言不詳,也沒有乙個完整的測試例子

首先src 目錄下有

testcgowin目錄下:

這裡的_obj目錄是cgo生成的

這裡需要展示的是go中如何呼叫c語言匯出函式,以及在c語言中如何呼叫go的匯出函式.

關鍵是cthread.go和cthread_windows.c兩個檔案

cthread.go內容:

packagectestcgowin

// extern void doadd(int, int);

import"c"

import(

"sync"

"fmt"

)varsumstruct

//export add

funcadd(x int) ()

sum.lock()

sum.i += x

sum.unlock()

varp *int

*p = 2

}functestcthread()

fmt.println("want=",want)

}這裡的:

// extern void doadd(int, int);

import"c"

這兩行非常關鍵,必須緊挨著,不能有空行,而且要緊跟著package語句,import要單獨寫

這裡的注釋相當於c語言宣告了乙個函式,你用#include當然也可以。遵循的都是c的語法,少個分號都是會報錯的。

然後是下面兩行:

//export add

funcadd(x int)

void

doadd(int max, int nthread)

;int i;

uintptr_t thread_id[maxthread];

if(nthread > maxthread)

nthread = maxthread;

for(i=0; i0, 0, addthread, &max, 0, 0);

for(i=0; i

我不曉得這個巨集win32_lean_and_mean什麼意思,跟著寫就行了,也沒有去查閱文件以及**。

這裡doadd是匯出函式,addthread不需要匯出,所以加了static,

#include "_cgo_export.h"

是因為我們需要呼叫go的匯出函式add,有興趣的可以看看_obj目錄

到此為止,相互之間的關係已經說明白了,當然go與c語言之間的型別轉換,留作以後再說。

接下來如果想要利用這個lib,很簡單,

執行cgo生成必要的檔案,然後go install將編譯生成testcgowin.a檔案,此檔案在pkg\windows_386目錄下

直接看testcgowin.go檔案內容即可:

packagemain

import"testcgowin"

funcmain()

c和go互相呼叫的關鍵都是通過注釋實現的,並且cgo會自己編譯相應的.c檔案,不需要特別說明,只需要放到相應目錄下即可。

總的來說go為了和c互操作做了很多,雖然沒法像c++那麼方便,但是基本上來收還是很順利的。

go與c互相呼叫

此例子來自於go原始碼中,藉此來和大家分享一下兩者如何呼叫,網上很多文章語言不詳,也沒有乙個完整的測試例子 首先src 目錄下有 testcgowin目錄下 這裡的 obj目錄是cgo生成的 這裡需要展示的是go中如何呼叫c語言匯出函式,以及在c語言中如何呼叫go的匯出函式.關鍵是cthread.g...

python與C 的互相呼叫

python與c 的互相呼叫 一 c 呼叫python 新建乙個專案,新增引用 ironpython.dll,microsoft.scripting.dll 在ironpython的安裝目錄中 建立乙個文字檔案命名為hello.py,把該檔案新增的當前的專案中,並設定為總是輸出。hello.py d...

Linux彙編與C互相呼叫

一 簡介 二 基礎知識 對於c和組合語言的介面主要有兩個問題需要解決 1 呼叫者與被呼叫者的引數傳遞 正常的,定義乙個函式總是希望它完成某些功能,乙個毫無用處的函式將毫無意義。這些功能有常常是更大的功能的一部分,而函式完成這些功能或多或少都要與外界聯絡 乙個完全不與外界聯絡的函式也是乙個毫無意義的函...