package main
import
"c"import
"fmt"
//export hello
func
hello()
//export add
func
add(a,b int
)int
func
main()
注意:生成c可呼叫的so時,go源**需要以下幾個注意。
必須匯入 「c」 包
必須在可外部呼叫的函式前加上 【//export 函式名】的注釋
必須是main包,切含有main函式,main函式可以什麼都不幹
先要安裝go的標準庫
go install -buildmode=shared -linkshared std
編譯共享庫
go build -buildmode=c-shared -o so庫檔名 自己的專案
然後當前目錄就會出現 ***.h和***.so檔案
#include
#include
"libtest.h"
//生成的標頭檔案
void
main()
編譯:
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即可。然後編譯時將靜態庫參與編譯即可。
注意:需要使用到cgo工具
直接在import 「c」之前新增乙個注釋。 然後使用c語法新增庫的標頭檔案。
針對共享庫由於是作業系統管理程式執行載入的共享庫,所以可以不用管,只需要將so庫放入對應的目錄即可。針對靜態庫,那麼就要在**中多新增一行,告訴編譯器編譯時需要連線的庫。// #cgo ldflags: -l ./ -lfoo
package main
//#cgo ldflags: -l ./ -lfoo 使用靜態庫時需要新增
//#include"***.h"
import
"c"***x
func
main()
Linux下動態庫 so 和靜態庫 a
一般情況下,在專案裡會把功能相似的 封裝成庫,方便使用和管理,同時增加了 的內聚性。庫分為兩種,一種為靜態庫,檔名以.a結尾,另一種是動態庫,檔名以.so結尾。靜態庫和動態庫的使用各有利弊。靜態庫的特點 動態庫的特點 現在用乙個微型的工程,來講述靜態庫 動態庫的生成和使用。假設有3個.c檔案,分別為...
Linux生成動態庫 so與生成靜態庫 a
動態庫共享庫 第一步 通過gcc fpic c 編譯生成.o檔案 gcc fpic c a.c 編譯生成.o檔案 fpic與位置無關 gcc fpic c b.c 生成a.o,b.o編譯檔案。第二步 通過上面已經生成的a.o,b.o檔案生成.so檔案 方法1 gcc shared wl o liba...
Linux下生成動態庫和靜態庫
最近搞linux的程式設計 寫寫這個 綜合網上例子和本人使用方法。編輯得到舉例的程式 hello.h hello.c和main.c hello.h 見程式1 為該函式庫的標頭檔案。hello.c 見程式2 是函式庫的源程式,其中包含公用函式hello,該函式將在螢幕上輸出 hello main.c ...