cgo通過動靜態庫呼叫c c

2021-09-01 08:19:26 字數 1949 閱讀 1144

可以參考: c++靜態庫與動態庫

概括:動靜態庫區別總結:

1 鏈結方式不一樣。呼叫階段不同動態庫在程式執行的時候進行呼叫,靜態庫在鏈結階段將彙編檔案與引用到的庫一起鏈結生成可執行檔案。因此前者生成的可執行檔案較後者小。 同時,當庫檔案改變時,動態庫只需要重新編譯庫檔案,而靜態庫需要編譯所有檔案。

2 庫檔案的搜尋路徑不一樣。 具體參考: ld搜尋路徑順序

假設有一下目錄結構及檔案

example

- main.go

- temp

- test.h

- test.cpp

#ifndef test_h

#define test_h

#ifdef __cplusplus

extern "c"

#endif

#endif

// test.cpp

#include "test.h"

int add(int a,int b)

現在分別進行靜動態庫編譯:

g++  -c  test.cpp
ar -scr libtest.a test.o
生成libtest.a靜態庫

利用以上生成的test.o

g++ -fpic -shared -o libtest.so test.o
生成動態庫libtest.so

// main.go

package main

/*cpart

*/ import "c"

import "fmt"

func main()

以上是main.go的**,其中cpart 是下面要針對靜動態庫進行修改的。

對於靜態庫,有兩點需要注意:

1 靜態庫的尋找目錄

2 使用的靜態庫

cpart 可以改為

#cgo cflags: -i ./temp

#cgo ldflags: -l ./temp -ltest

#include "test.h"

執行命令

cd  example

go run main.go // or go build -o exam && ./exam

對於動態庫,依舊需要注意尋找庫的路徑,可以設定 ld_library_path 環境變數,或者直接把libtest.so放在/usr/lib, 然後更改 cpart 為:

#cgo cflags: -i ./temp

#cgo ldflags: -ltest

#include "test.h"

程式執行與以上的方式一樣。

如果報錯:

cannot open shared object file: no such file or directory

exit status 127

說明 沒有找到動態庫檔案, 自定義動態庫的搜尋路徑也可以看看ldconfig的使用

1 以上的c/c++ 程式只是乙個 cpp, 如果有多個的(test.cpp, test.h, exam.cpp, exam.h)該如果使用? 方法類似,可以網上找相關資料了解。

2 如果動態庫與靜態庫檔案放在乙個目錄下,會發生什麼情況?

可以參考下:gcc 庫路徑裡同時有相同檔名的動態庫和靜態庫

3 gcc 與 g++ 區別

C C 動 靜 態庫

如果多個程式使用同乙個動態庫,如果動態庫出現bug,不需要公升級所用該動態庫的程式,只要公升級該動態庫。該動態庫只有這乙個,沒有其他副本,節省記憶體空間 靜態庫是編譯的時候被載入,使用靜態庫的好處 使用靜態庫編譯好的 程式在任何機器上都可以直接執行。如果有多個程式使用該靜態庫,如果公升級該靜態庫,使...

windows下通過cgo引用靜態庫

結論 windows下引用.lib形式的靜態庫是不可以的。在go build的時候,會出現 command line arguments warning corrupt drectve at end of def file錯誤。在執行的時候,會出現segmentation fault錯誤。補充 wi...

cgo中呼叫C動態庫 靜態庫

include include include 包含header的目錄 cgo cflags i home leen header l指定所在目錄,支援絕對 相對路徑,l指定類庫名稱 去掉前面的lib及後面的.so,如libusbkey.so為 lusbkey 靜態庫方式 字尾名為.a 編譯時庫內容...