此例子來自於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 呼叫者與被呼叫者的引數傳遞 正常的,定義乙個函式總是希望它完成某些功能,乙個毫無用處的函式將毫無意義。這些功能有常常是更大的功能的一部分,而函式完成這些功能或多或少都要與外界聯絡 乙個完全不與外界聯絡的函式也是乙個毫無意義的函...