首頁  >  文章  >  後端開發  >  如何使用 GCCGO 將 Go 函數整合到現有的 C 專案中?

如何使用 GCCGO 將 Go 函數整合到現有的 C 專案中?

Linda Hamilton
Linda Hamilton原創
2024-10-26 22:42:02765瀏覽

How to Integrate Go Functions into Existing C Projects Using GCCGO?

在現有C 專案中使用Go

背景:
您有一個由多個物件組成的C 程式檔案儲存在存檔檔案(.a) 中。您打算在專案中新增一個新的 Go 文件,將其編譯為目標文件,並將其合併到現有存檔中。

目標:
將 Go 函數整合到您的 C 語言中程式。

過程:

1.將Go 檔案編譯為目標檔案:

  • 執行以下🎜>運行以下指令:

    gccgo -c printString.go -o printString.o -fgo-prefix=print -Wall -Werror -march=native

2.從C:

  • 在c_caller.c 檔案中呼叫Go 函數,宣告一個extern 函數:

    extern int PrintString(char*) __asm__ ("print.main.PrintString");
  • 在main 函數,呼叫Go 函數並處理結果:

    int result = PrintString(string_to_pass);
    if (result) { printf("Everything went as expected!\n"); }
    else       { printf("Uh oh, something went wrong!\n"); }

3 .使用GCCGO 建構整個專案:

  • 執行以下指令:
    gccgo -o main c_caller.c printString.o -Wall -Werror -march=native

4.解決錯誤:

  • 如果您遇到「未定義的對main.main 的參考」之類的錯誤,請確保您的C 程式碼中有main 函數。
  • 如果您遇到類似「cannot find -lgo」的錯誤,請驗證 LD_LIBRARY_PATH 環境變數是否設定為指向 libgo.so 所在的資料夾。

Go 1.5 中的替代解決方案:

在Go 1.5(8 月推出)中,一項新功能允許從Go 程式碼建立C 相容庫。借助此功能,您可以直接從 Go 檔案建立靜態或共享庫,從而無需中間物件檔案。

範例:

  • 在main.c 中:
    #include <stdio.h>
    
    int main()
    {
      char *string_to_pass = NULL;
      if (asprintf(&amp;string_to_pass, "This is a test.") < 0) {
          printf("asprintf fail");
          return -1;
      }
    
      PrintString(string_to_pass);
      return 0;
    }
  • package main
    
    import "C"
    import "fmt"
    
    //export PrintString
    func PrintString(cs *C.char) {
      s := C.GoString(cs)
      fmt.Println(s)
    }
    
    func main() {}
在在. go 中(使用go build -buildmode c-archive ... 編譯為static 或go build -buildmode c-shared 。 .. 對於共用函式庫):

以上是如何使用 GCCGO 將 Go 函數整合到現有的 C 專案中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn