如何使用 GCCGO 將 Go 函數整合到現有的 C 專案中?
Oct 26, 2024 pm 10:42 PM在現有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() {}
登入後複製
以上是如何使用 GCCGO 將 Go 函數整合到現有的 C 專案中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
擊敗分裂小說需要多長時間?
3 週前
By DDD
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
擊敗分裂小說需要多長時間?
3 週前
By DDD
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)