1 回答

TA貢獻1804條經驗 獲得超2個贊
要構建可從 C 調用的存檔,您需要將它們標記為導出的 CGo 符號。
例如,如果我創建一個foo.go包含以下內容的文件:
package main
import (
"C"
"fmt"
)
//export PrintInt
func PrintInt(x int) {
fmt.Println(x)
}
func main() {}
需要注意的重要事項是:
需要調用包 main
你需要有一個main函數,雖然它可以是空的。
您需要導入包 C
您需要特殊//export注釋來標記您希望從 C 中調用的函數。
我可以使用以下命令將其編譯為 C 可調用靜態庫:
go build -buildmode=c-archive foo.go
結果將是一個存檔foo.a和一個標題foo.h。在標題中,我們得到以下內容(刪除不相關的部分):
...
typedef long long GoInt64;
...
typedef GoInt64 GoInt;
...
extern void PrintInt(GoInt p0);
...
所以這足以調用導出的函數。我們可以編寫一個簡單的 C 程序,像這樣調用它:
#include "foo.h"
int main(int argc, char **argv) {
PrintInt(42);
return 0;
}
我們可以使用如下命令編譯它:
gcc -pthread foo.c foo.a -o foo
該-pthread選項是必需的,因為 Go 運行時使用線程。當我運行生成的可執行文件時,它會打印42.
- 1 回答
- 0 關注
- 146 瀏覽
添加回答
舉報