Golang生成C動態庫.so和靜態庫.a

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源代碼需要以下幾個注意。

  1. 必須導入 “C” 包
  2. 必須在可外部調用的函數前加上 【//export 函數名】的註釋
  3. 必須是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 。如果想將自己所在的文件夾也添加到庫搜索目錄中去。那麼有兩種方式:

  1. 修改配置文件,將自己的目錄添加到庫搜索目錄列表中去。/etc/ld.so.conf 然後執行ldconfig
  2. 修改環境變量,臨時改變庫搜索路徑。 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:自己的目錄

如何生成靜態庫

只需要將buildmode改爲c-archive即可。然後編譯時將靜態庫參與編譯即可。

Go調用C庫

源代碼

注意:

需要使用到cgo工具

  1. 直接在import “C”之前添加一個註釋。 然後使用C語法添加庫的頭文件。
  2. 針對共享庫由於是操作系統管理程序運行加載的共享庫,所以可以不用管,只需要將so庫放入對應的目錄即可。針對靜態庫,那麼就要在代碼中多添加一行,告訴編譯器編譯時需要連接的庫。// #cgo LDFLAGS: -L ./ -lfoo
     
package main

//#cgo LDFLAGS: -L ./ -lfoo     使用靜態庫時需要添加
//#include"xxx.h"
import "C"
xxxx
func main(){
    
    C.xxx(xxx)
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章