網上有很多講解使用cgo實現go中呼叫c**的部落格。總結起來,go中呼叫c一共有兩種辦法:
第一種是將c**直接嵌入到go原始檔中
第二種是將c**寫在c檔案中,再在go檔案中引入
go 語言呼叫c庫
示例:int count;
void foo();
#include
#include "foo.h"
int count = 6;
void foo() {
printf("i am foo!\n");
//go program
package main
// #cgo ldflags: -l ./ -lfoo
// #include
// #include
// #include "foo.h"
import "c"
import "fmt「
func main() {
fmt.println(c.count)
c.foo()
針對第二種呼叫方法,有以下3種解決方案。
方法1:go呼叫靜態庫
$> gcc -c foo.c
$> ar rv libfoo.a foo.o
$> go build foo.go
$> ./foo
注意:低版本可能不支援呼叫靜態庫,我測試go version go1.7.3 linux/amd64可以
解決方案:因為沒有將共享庫libfoo.so放在標準目錄,所以要給裝入器(loader)點幫助。有幾個選擇:可以用環境變數ld_library_path,或者rpath。
方法3:在含有c函式聲名和定義的go程式的當前檔案目錄下,直接執行命令:go build即可。
C 總結(四)呼叫C 動態庫
由於公司很多底層的sdk,都是c 開發,上層的應用軟體卻是c winform程式。在實際工作的過程中,就經常碰到了c 程式呼叫c 動態庫的問題。最近一直在和c 打交道,c 怎麼呼叫c 類庫函式。也遇到了一些問題,所以就來總結總結c 程式呼叫c 動態庫時的各種坑。1.可能遇到的問題 c 在呼叫動態庫的...
go與c互相呼叫
此例子來自於go原始碼中,藉此來和大家分享一下兩者如何呼叫,網上很多文章語言不詳,也沒有乙個完整的測試例子 首先src 目錄下有 testcgowin目錄下 這裡的 obj目錄是cgo生成的 這裡需要展示的是go中如何呼叫c語言匯出函式,以及在c語言中如何呼叫go的匯出函式.關鍵是cthread.g...
go與c互相呼叫
此例子來自於go原始碼中,藉此來和大家分享一下兩者如何呼叫,網上很多文章語言不詳,也沒有乙個完整的測試例子 首先src 目錄下有 testcgowin目錄下 這裡的 obj目錄是cgo生成的 這裡需要展示的是go中如何呼叫c語言匯出函式,以及在c語言中如何呼叫go的匯出函式.關鍵是cthread.g...