Go 生成C動態庫.so和靜態庫.a
阿新 • • 發佈:2018-12-06
Go 生成C動態庫.so和靜態庫.a
原始碼
package main
import "C"
import "fmt"
//export hello
func hello(){
fmt.Println("hello world")
}
//export add
func add(a,b int) int {
return a+b
}
func main(){
}
注意:生成C可呼叫的so時,Go原始碼需要以下幾個注意。
- 必須匯入 “C” 包
- 必須在可外部呼叫的函式前加上 【//export 函式名】的註釋
- 必須是main包,切含有main函式,main函式可以什麼都不幹
編譯
先要安裝go的標準庫
go install -buildmode=shared -linkshared std
編譯共享庫
go build -buildmode=c-shared -o so庫檔名 自己的專案
然後當前目錄就會出現 xxx.h和xxx.so檔案
C
#include<stdio.h>
#include"libtest.h" //生成的標頭檔案
void main(){
hello();
printf("\n2+3=%d\n",add(2,3));
}
編譯:
gcc goso.c -L ./ -ltest -o goso
執行
由於是共享庫,那麼執行時就需要載入需要的庫。在linux中預設庫的路徑為/usr/lib 或者/usr/lib64 。如果想將自己所在的資料夾也新增到庫搜尋目錄中去。那麼有兩種方式:
- 修改配置檔案,將自己的目錄新增到庫搜尋目錄列表中去。/etc/ld.so.conf 然後執行ldconfig
- 修改環境變數,臨時改變庫搜尋路徑。 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:自己的目錄
如何生成靜態庫
只需要將buildmode改為c-archive即可。然後編譯時將靜態庫參與編譯即可。
Go呼叫C庫
原始碼
注意:
- 需要使用到cgo工具
- 直接在import “C”之前新增一個註釋。 然後使用C語法新增庫的標頭檔案。
- 針對共享庫由於是作業系統管理程式執行載入的共享庫,所以可以不用管,只需要將so庫放入對應的目錄即可。針對靜態庫,那麼就要在程式碼中多新增一行,告訴編譯器編譯時需要連線的庫。// #cgo LDFLAGS: -L ./ -lfoo
package main
//#cgo LDFLAGS: -L ./ -lfoo 使用靜態庫時需要新增
//#include"xxx.h"
import "C"
xxxx
func main(){
C.xxx(xxx)
}