go語言與c語言的相互呼叫

2021-09-17 08:29:06 字數 2159 閱讀 2385

由於工作原因,需要實現go語言與c語言的相互呼叫。由於go語言與c語言有著千絲萬縷的曖昧關係,兩者之間的呼叫可以通過語言層面實現。下文是對此的總結。

go語言呼叫c語言

以下為乙個簡短的例子:

package main

// #include // #include /*

void print(char *str)

*/import "c"

import "unsafe"

func main()

與「正常」的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等。

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

// hello.go

package main

// #cgo ldflags: -l ./ -lhello

// #include // #include // #include "hello.h"

import "c"

func main()

// hello.c

#include "hello.h"

void hello()

// 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()

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

// hello.c

#include #include "libhello.h"

int main()

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

小結go語言可以通過內嵌c**的形式呼叫c語言,也可以通過呼叫共享庫函式的方式實現;至於c語言呼叫go函式,則可以通過go build將go**編譯成共享庫提供給c**使用。注意,本文中的共享庫均為動態共享庫,至於靜態共享庫則未曾實驗,有興趣的可以實現一下。

C語言與C 語言相互呼叫

1 c 呼叫c中的函式 1.1 c 呼叫c中的函式 正確使用 1 案例原始檔組成 圖12 math模組包含檔案 1 原始檔math.c 圖22 標頭檔案math.h 圖33 主模組包含檔案 1 原始檔main.cpp 圖42 標頭檔案module.h 圖54 編譯math模組 圖65 編譯主模組 圖...

c語言和c 的相互呼叫

在實際專案開發中,c和c 的相互呼叫是常見的,c 能夠相容c語言的編譯方式,但是c 編譯器g 缺省會以c 的方式編譯程式,而c程式編譯器gcc會預設以c的方式編譯它,所以c和c 的相互呼叫存在一定的技巧。1.c方式編譯和c 方式編譯 一般.cpp檔案是採用g 去編譯,c檔案是採用gcc編譯,然而這不...

OC與Swift語言的相互呼叫

1.在oc呼叫swift語言的 在使用oc編寫的工程中建立swift語言的 建立的時候會給出乙個是否建立oc語言的橋梁,選擇建立 目的是引入oc 語言的標頭檔案的,是讓swift語言執行oc 語言程式的。並不是讓oc執行swift語言程式的。如果想要讓oc執行swift語言程式的話,他會建立出乙個不...