日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言中go的作用,go语言与c语言的相互调用

發(fā)布時(shí)間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言中go的作用,go语言与c语言的相互调用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

由于工作原因,需要實(shí)現(xiàn)go語言與c語言的相互調(diào)用。由于go語言與c語言有著千絲萬縷的曖昧關(guān)系,兩者之間的調(diào)用可以通過語言層面實(shí)現(xiàn)。下文是對此的總結(jié)。

?

go語言調(diào)用c語言

以下為一個(gè)簡短的例子:

package main

// #include

// #include

/*

void print(char *str) {

printf("%s\n", str);

}

*/

import "C"

import "unsafe"

func main() {

s := "Hello Cgo"

cs := C.CString(s)

C.print(cs)

C.free(unsafe.pointer(cs))

}

與“正常”的go代碼相比,上述代碼有幾處“特殊”的地方:

在開頭的注釋中出現(xiàn)了c語言頭文件的include字樣

在注釋中定義了c語言函數(shù)print

import了一個(gè)名為C的“包”

在main函數(shù)中調(diào)用了上述定義的c語言函數(shù)print

首先,go源碼文件中的c語言代碼是需要用注釋包裹的,就像上面的include頭文件以及print函數(shù)定義;其次,import "C"這個(gè)語句是必須的,而且其與上面的c代碼之間不能用空行分隔,必須緊密相連。這里的”C“不是包名,而是一種類似名字空間的概念,或可以理解為偽包,c語言所有語法元素均在該偽包下面;最后,訪問c語法元素時(shí)都要在其前面加上偽包前綴,比如C.uint和上面代碼中的C.print、C.free等。

更詳細(xì)的在go中調(diào)用c語言的用法可以參考Go與C語言的互操作,本文不再一一細(xì)述。

在上面的例子中,c語言是內(nèi)嵌在go代碼中的,如果代碼量更大更復(fù)雜的話,這顯然是很不”專業(yè)“的。那么,是否可以將c語言代碼從go代碼中分離出去,單獨(dú)定義呢?答案是肯定的,可以通過共享庫的方式實(shí)現(xiàn)。

cgo提供了#cgo指示符可以指定go源碼在編譯后與哪些共享庫進(jìn)行鏈接。例子如下:

// hello.go

package main

// #cgo LDFLAGS: -L ./ -lhello

// #include

// #include

// #include "hello.h"

import "C"

func main() {

C.hello()

}

// hello.c

#include "hello.h"

void hello()

{

printf("hello, go\n");

}

// hello.h

extern void hello();

其中在hello.go中,#cgo指示符后面添加LDFLAGS: -L ./ -lhello,作用是在go代碼編譯時(shí),指定在當(dāng)前目錄查找so庫并進(jìn)行鏈接。

因此,只需要把hello.c編譯成動態(tài)庫,再編譯go代碼,即可在運(yùn)行g(shù)o代碼的時(shí)候調(diào)用共享庫中的c語言函數(shù)。指令如下:

gcc -fPIC -o libhello.so hello.c

go build -o hello

./hello

c語言調(diào)用go語言

與在go中調(diào)用c源碼相比,在c中使用go函數(shù)的場合較少。因?yàn)橐话銇碚f,采用高級語言作為粘合劑調(diào)用低級語言能充分發(fā)揮各自的特點(diǎn),而用低級語言調(diào)用高級語言反而有可能降低低級語言的性能優(yōu)勢,在go中,可以使用”export + 函數(shù)名“來導(dǎo)出go函數(shù)為c代碼所用,看一個(gè)簡單的例子:

// hello.go

package main

import "C"

import "fmt"

// export Go2C

func Go2C() {

fmt.Println("hello, C")

}

可通過go build的編譯選項(xiàng),將go代碼編譯成共享庫以供c代碼調(diào)用。注意,編譯so庫時(shí)必須存在main及main函數(shù)(即使main函數(shù)為空)。編譯指令如下:go build -v -x -buildmode=c-shared -o libhello.so hello.go。

編譯成功后,只需在c代碼中引入新生成的頭文件及編譯時(shí)鏈接動態(tài)庫即可實(shí)現(xiàn)go函數(shù)的調(diào)用。代碼如下:

// hello.c

#include

#include "libhello.h"

int main()

{

Go2C();

return 0;

}

通過gcc -o hello -L. -lhello,即可編譯成可執(zhí)行程序。注意,運(yùn)行前必須確定共享庫運(yùn)行時(shí)查找路徑中存在需要鏈接的共享庫,可通過將so庫路徑放到/usr/lib或者修改環(huán)境變量LD_LIBRARY_PATH。

小結(jié)

go語言可以通過內(nèi)嵌c代碼的形式調(diào)用c語言,也可以通過調(diào)用共享庫函數(shù)的方式實(shí)現(xiàn);至于c語言調(diào)用go函數(shù),則可以通過go build將go代碼編譯成共享庫提供給c代碼使用。注意,本文中的共享庫均為動態(tài)共享庫,至于靜態(tài)共享庫則未曾實(shí)驗(yàn),有興趣的可以實(shí)現(xiàn)一下。

總結(jié)

以上是生活随笔為你收集整理的c语言中go的作用,go语言与c语言的相互调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。