自Go 1.5 發布以來,出現了將Go 與現有C 專案整合的可能性。本指南旨在解決如何從 C 程式中呼叫 Go 程式碼的問題。
Go 1.5 引入了 -buildmode=c-archive 選項,促進了 C 可呼叫存檔的產生。然而,產生必要的頭檔可能會帶來挑戰。要解決此問題,將函數標記為導出的 CGo 符號至關重要。
為了說明這一點,請考慮foo.go 中的以下Go 程式碼:
package main import ( "C" "fmt" ) //export PrintInt func PrintInt(x int) { fmt.Println(x) } func main() {}
將此程式碼編譯為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; }
要編譯此C 程式:
gcc -pthread foo.c foo.a -o foo
-pthread 選項是必要的,因為Go 執行緒使用執行緒。執行後,程式將輸出 42。
透過執行以下步驟,您可以在現有 C 專案中有效地使用 Go 程式碼,受益於 Go 的進階功能,同時保留 C 提供的低階存取權.
以上是如何在 C 程式中呼叫 Go 程式碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!