Linux下動態載入庫

2021-06-01 09:37:22 字數 1551 閱讀 3900

七月 9th, 2011

以前看到過windows下載入動態庫的例子,linux下沒有特別關注過。動態載入庫有很多好處,比如通過讀取配置檔案,按照配置資訊來為指定型別或指定目錄下的資料使用指定的動態庫方法,既實現了程式的松耦合,也方便擴充套件。

在linux下動態載入庫要使用到dl庫。使用的方法記錄如下:

1、先生成乙個動態庫libtest.so

1:  

/* test.c */

2:  #include
3:  

int add(int a, int b)

4:
8:  

void sayhello(char *s)

9:

編譯庫: gcc –fpic –shared –o libtest.so test.c

2、程式動態載入庫

1:  

/* main.c */

2:  #include
3:  #include
4:  #include
5:  #include
6:  #incllude //dl庫使用到的方法
7:  #include
8:
9:  

int main()

10:

編譯程式:gcc –o main main.c –ldl

將libtest.so置於main同目錄,執行./main,將會看到呼叫動態庫兩個方法的結果。

通過使用條件編譯,可以分別實現windows和linux下的動態庫載入,實現自己的乙個程式框架變成了現實。

一般來說,完全使用c編寫**機會很少,c++中呼叫動態庫和c稍有不同,具體體現在下面幾點:

extern

"c"int add(int a, int b)

extern

"c"void sayhello(char *s)

然後編譯使用 g++ –fpic –shared –o libtest.so test.cpp

2、獲取動態庫函式指標處需要進行型別轉換,即main.c原始碼第13行和第15行需要修改為

int (*method1)(int, int) = (int (*)(int, int))dlsym(handler, "add");
void (*method2)(char *s) = (void (*)(char *))dlsym(handler, "sayhello");
然後編譯 g++ –ldl –o main main.cpp
歸納一下:
1、動態庫被呼叫函式需要使用extern "c"修飾符;
2、動態庫編譯時需要使用-fpic編譯選項;
3、呼叫動態庫,需要包括 dlfcn.h標頭檔案;
4、使用dlopen、dlsym和dlclose、dlerror函式裝載和呼叫動態庫及其方法、解除安裝動態庫以及獲取錯誤資訊。

Linux下動態載入

linux提供了一套api來動態裝載庫。下面列出了這些api dlopen,開啟乙個庫,並為使用該庫做些準備。dlsym,在開啟的庫中查詢符號的值。dlclose,關閉庫。dlerror,返回乙個描述最後一次呼叫dlopen dlsym,或dlclose的錯誤資訊的字串。c語言使用者需要包含標頭檔案...

Linux下的靜態庫 動態庫和動態載入庫

linux下可以建立兩種型別的庫 靜態庫 a 在鏈結期間被應用程式直接鏈結進可執行檔案 動態鏈結庫 so 動態庫還分為兩種用法 a 應用程式執行期間鏈結動態庫,但是在編譯期間宣告動態庫的存在,也就是說這種動態庫必須在編譯時對編譯器可見,但編譯器卻不將此種庫編譯進可執行檔案 b 在執行期間,動態載入和...

linux下編譯動態載入庫,靜態庫等

乾貨直接來 linux下靜態庫 動態庫的makefile建立。gcc fpic c add.c include 放標頭檔案 生成add.o目標檔案 gcc shared o libadd.so add.o 生成libadd.so動態庫 這個庫的名是add 將這個庫放在根目錄的lib檔案裡 gcc o...