中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang與c語言是怎么相互調用

發布時間:2021-11-25 15:03:30 來源:億速云 閱讀:119 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“golang與c語言是怎么相互調用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“golang與c語言是怎么相互調用”這篇文章吧。

go語言調用c語言

以下為一個簡短的例子:

package main

// #include <stdio.h>
// #include <stdlib.h>
/*
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代碼相比,上述代碼有幾處“特殊”的地方:

  • 在開頭的注釋中出現了c語言頭文件的include字樣

  • 在注釋中定義了c語言函數print

  • import了一個名為C的“包”

  • 在main函數中調用了上述定義的c語言函數print

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

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

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

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

// hello.go
package main

// #cgo LDFLAGS: -L ./ -lhello
// #include <stdio.h>
// #include <stdlib.h>
// #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代碼編譯時,指定在當前目錄查找so庫并進行鏈接。

因此,只需要把hello.c編譯成動態庫,再編譯go代碼,即可在運行go代碼的時候調用共享庫中的c語言函數。指令如下:

  • gcc -fPIC -o libhello.so hello.c

  • go build -o hello

  • ./hello

c語言調用go語言

與在go中調用c源碼相比,在c中使用go函數的場合較少。因為一般來說,采用高級語言作為粘合劑調用低級語言能充分發揮各自的特點,而用低級語言調用高級語言反而有可能降低低級語言的性能優勢,在go中,可以使用”export + 函數名“來導出go函數為c代碼所用,看一個簡單的例子:

// hello.go
package main

import "C"

import "fmt"

// export Go2C
func Go2C() {
    fmt.Println("hello, C")
}

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

編譯成功后,只需在c代碼中引入新生成的頭文件及編譯時鏈接動態庫即可實現go函數的調用。代碼如下:

// hello.c
#include <stdio.h>
#include "libhello.h"

int main()
{
    Go2C();
    return 0;
}

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

以上是“golang與c語言是怎么相互調用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淅川县| 会昌县| 南岸区| 桦南县| 洪江市| 宜昌市| 安陆市| 会昌县| 万源市| 福建省| 灵台县| 怀宁县| 玉溪市| 山阳县| 富裕县| 宁津县| 隆子县| 同心县| 宁武县| 金门县| 聊城市| 高密市| 富蕴县| 清原| 乌拉特前旗| 邹城市| 云阳县| 桃园县| 陆良县| 汝城县| 万安县| 虹口区| 延川县| 乐安县| 黔东| 韶关市| 武川县| 江津市| 平遥县| 临高县| 海城市|