go學習(四) 呼叫C庫

2021-08-04 14:25:16 字數 911 閱讀 3114

網上有很多講解使用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...