使用GCCGO 從C 程式呼叫Go 函數
簡介
整合Go 程式碼在現像有的C 專案中,必須從Go 檔案建立一個目標檔案(.o),並將其合併到C 專案的存檔(.a) 檔案中。本文詳細說明如何使用 GCCGO 來完成此任務。
建立Go 物件檔案
要從Go 文件建立物件文件,請使用gccgo帶有-c 選項的命令編譯檔案而不連結它:
gccgo -c printString.go -o printString.o -fgo-prefix=print -Wall -Werror -march=native
-fgo-prefix 選項指定從Go 檔案匯出的符號的前綴。
將Go 函數連結到C 程式
要將Go 目標檔案連結到C 程序,請在C 程式碼中使用extern 宣告和__asm__ 關鍵字:
<code class="c">#include <stdio.h> extern int PrintString(char*) __asm__ ("print.main.PrintString");</stdio.h></code>
This使用GCCGO 的正確簽章和符號名稱來宣告PrintString 函數。
編譯
要使用Go 目標檔編譯C 程序,請使用gccgo 和-o指定輸出執行檔的選項:
gccgo -o main c_caller.c printString.o -Wall -Werror -march=native
解決編譯錯誤
原始問題中提到的初始編譯錯誤表明GCCGO 需要Go 中的main 函數檔。然而,當連結到 C 程式時,這不是必需的。要解決此問題,請確保:
- Go 檔案不包含 main 函數。
- C 程式定義了自己的 main 函數。
其他選項
要解決與缺少庫引用相關的連結器錯誤,請嘗試以下選項:
- - -static-libgo:使用靜態版本
- -static:連結靜態庫而不是共享庫。
- -Wl,-R,/path/to/libgo.so's_folder:指定路徑包含 libgo.so 的資料夾。
Go 1.5 的範例(2015 年 8 月)
Go 1.5 引入了直接使用建置 C 相容程式庫的功能去工具。此方法顯著簡化了流程:
_main.c
<code class="c">#include <stdio.h> int main() { char *string_to_pass = NULL; if (asprintf(&string_to_pass, "This is a test.") <p><strong>main.go</strong></p> <pre class="brush:php;toolbar:false"><code class="go">package main import "C" import "fmt" //export PrintString func PrintString(cs *C.char) { s := C.GoString(cs) fmt.Println(s) } func main() {}</code>
main.go
go build -buildmode c-archive -o mygopkg.a gcc -o main _main.c mygopkg.a -lpthreadmain.go
main.go
go build -buildmode c-shared -o mygopkg.so LD_RUN_PATH=$(pwd) gcc -o main _main.c mygopkg.so -lpthread建置為靜態函式庫:建置為共用程式庫:
以上是如何使用 GCCGO 從我的 C 程式呼叫 Go 函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

OpenSSL,作為廣泛應用於安全通信的開源庫,提供了加密算法、密鑰和證書管理等功能。然而,其歷史版本中存在一些已知安全漏洞,其中一些危害極大。本文將重點介紹Debian系統中OpenSSL的常見漏洞及應對措施。 DebianOpenSSL已知漏洞:OpenSSL曾出現過多個嚴重漏洞,例如:心臟出血漏洞(CVE-2014-0160):該漏洞影響OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻擊者可利用此漏洞未經授權讀取服務器上的敏感信息,包括加密密鑰等。

本文演示了創建模擬和存根進行單元測試。 它強調使用接口,提供模擬實現的示例,並討論最佳實踐,例如保持模擬集中並使用斷言庫。 文章

本文探討了GO的仿製藥自定義類型約束。 它詳細介紹了界面如何定義通用功能的最低類型要求,從而改善了類型的安全性和代碼可重複使用性。 本文還討論了局限性和最佳實踐

本文討論了GO的反思軟件包,用於運行時操作代碼,對序列化,通用編程等有益。它警告性能成本,例如較慢的執行和更高的內存使用,建議明智的使用和最佳

本文使用跟踪工具探討了GO應用程序執行流。 它討論了手冊和自動儀器技術,比較諸如Jaeger,Zipkin和Opentelemetry之類的工具,並突出顯示有效的數據可視化

本文討論了GO中使用表驅動的測試,該方法使用測試用例表來測試具有多個輸入和結果的功能。它突出了諸如提高的可讀性,降低重複,可伸縮性,一致性和A


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

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

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中