linux下動態呼叫靜態庫的方法

2021-09-24 04:16:34 字數 1943 閱讀 4055

linux下動態庫呼叫靜態庫的方法

有這樣一種情形,在建立乙個動態庫的同時,可能會呼叫乙個靜態庫,這個靜態庫可能是你自己寫的,也可能是第三方的。比如有下面五個檔案,生成乙個靜態庫,乙個動態庫,乙個執行檔案:

/// static.h

void static_print();

/#include

#include "static.h"

void static_print()

// shared.h

void shared_print();

// shared.cpp

#include

#include "shared.h"

#include "static.h"

void shared_print()

test.cpp

#include "share.h"

int main()

怎麼辦呢?方法有兩種:

1、  動態庫是動態庫,靜態庫是靜態庫,各自編譯自己的,然後在最終使用的可執行檔案上再動態編譯載入。按上面的例子來說明:

靜態庫的.o檔案不用-fpic生成. 生成動態庫時不加表態庫.

生成應用程式時載入動態庫和靜態庫.

g++ -c static.cpp // 生成static.o

ar -r libstatic.a static.o // 生成靜態庫libstatic.a

g++ -c -fpic shared.cpp // 生成shared.o

g++ -shared shared.o -o libshared.so // 生成動態庫libshared.so 注: -shared是g++的選項,與shared.o無關.這時如果加

-lstatic. error:relocation r_x86_64_32 against `a local symbol' can not be used when ****** a shared object; recompile with –fpic

(這裡測試沒有出現這個問題,特意測試了一下)

g++ test.cpp  -l. -lshared -lstatic -o test.exe // link libshared.so 到test.exe中

2、  把靜態庫直接打到動態庫中去。

靜態庫的.o檔案也用-fpic生成. 生成動態庫時把靜態庫加入.

生成應用程式時只載入動態庫

g++ -c -fpic static.cpp // 生成static.o

ar -r libstatic.a static.o // 生成靜態庫libstatic.a

g++ -c -fpic shared.cpp // 生成shared.o

g++ -shared shared.o –l. -lstatic -o libshared.so   // 生成動態庫libshared.so 注: -shared是g++的選項,與shared.o無關. -lstatic選項把libstatic.a的函式加入動態庫中.

g++ test.cpp   –l. -lshared -o test.exe // link libshared.so 到test.exe中.

這個例子是從網上找來的,非常感謝。

至於哪種方式好,個人還是覺得看你的實際應用情況,仁者見仁,智者見智。

將多個靜態庫檔案合成乙個靜態庫檔案。

假設tempa.a, tempb.a tempc.a 在/home/lib目錄下

mkdir /mytemp/libtest

cd /mytmp/libtest

ar x /home/lib /tempa.a

ar x /home/lib /tempb.a

ar x /home/lib tempc.a

ar cru libtest.a *.o

ranlib libtest.a

Linux 下動態庫和靜態庫的建立和呼叫

每個程式實質上都會鏈結到乙個或者多個的庫。比如使用c函式的程式會鏈結到c執行時庫,gui程式會鏈結到視窗庫等等。無論哪種情況,你都會要決定是鏈結到靜態庫 static libary 還是動態庫 dynamic libary 鏈結到靜態庫會使你的程式臃腫,並且難以公升級,但是可能會比較容易部署。而鏈結...

Linux下的動態庫和靜態庫

靜態庫 程式編譯時載入,可執行程式體積大。一般命名為lib x.a。動態庫 程式執行時載入,可執行程式體積小。一般命名為lib x.so.1.3。x一般指庫名,如libxml2 tinyxml等 動態庫一般預設安裝在 lib 或者 usr lib 或者 usr local lib下。如果安裝的庫不在...

linux下的動態庫和靜態庫

1 使用gcc建立和使用靜態庫 1 gcc o mylib.o c mylib.c 生成o檔案 2 ar rcs libmylib.a mylib.o 生成a檔案 c create的意思 r replace的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。3 cp libmylib.a u...