Go 生成C動態庫 so和靜態庫 a

2021-09-02 16:49:40 字數 1396 閱讀 5340

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 ...