linux下動態庫的使用

2021-07-28 02:46:20 字數 2778 閱讀 6756

動態庫的呼叫分為隱式呼叫和顯式呼叫

動態庫是由原始檔編譯而成的,與普通程式不同的是,動態庫沒有main函式,不能單獨執行,需要被呼叫才能執行。

寫乙個四則運算的動態庫

calculate.h檔案

#ifndef calculate_h_h

#define calculate_h_h

//加法

int add(int a, int b);

//減法

int sub(int a, int b);

//乘法

int mul(int a, int b);

//除法

int div(int a, int b);

#endif

calculate.c檔案

#include "calculate.h"

//加法

int add(int a, int b)

//減法

int sub(int a, int b)

//乘法

int mul(int a, int b)

//除法

int div(int a, int b)

將原始檔編譯成動態庫

gcc -shared -fpic calculate.c -o libcal.so

linux下的動態庫的字尾名都是.so

動態庫寫好了,下面開始呼叫,先看看隱式呼叫。

main.c

#include #include "calculate.h"

int main()

可以看出,隱式呼叫只需要包含動態庫的標頭檔案就行了。接下來編譯main.c程式。

gcc main.c -o main -l . -lcal

gcc main.c -o main -l . libcal.so

上述兩種編譯方法都可以。-l後跟的是我們動態庫所在的目錄,我們將動態庫和main.c程式放一起了,所以目錄就是當前目錄。後面-lcal是去除動態庫名字的lib和字尾。或者直接寫動態庫名字也可以。

下面執行程式

我們發現了錯誤,找不到該動態庫。問題就在於雖然指定了動態庫的路徑,但執行時還是會從系統預設的動態庫路徑中去查詢。所以解決辦法就是講我們寫的動態庫路徑加入到系統的動態庫路徑中去。如果程式中使用了很多動態庫,那就需要先看看是哪個動態庫不能找到,方法就是

可以看到的確是libcal.so這個動態庫未找到。

下面開始新增。

在/etc/ld.so.conf.d/目錄下新建動態庫相應的配置檔案calculate.conf

新增上動態庫的絕對路徑:

/home/zxin/dynamic_libiary

使配置生效

sudo ldconfig

接著我們重新執行main程式

成功!

顯示呼叫如下。需要載入動態庫--定位所需要的函式--呼叫該函式。需要用到頭檔案以及dlopen、dlsym、 dlclose等函式。

new_main.c

#include #include #define dll_file_name "libcal.so"

int main()

int a = 6, b = 2;

pfun func;

func = dlsym(handle, "add");//定位動態庫中的函式

printf("%d + %d = %d\n", a, b, func(a, b));//呼叫動態庫中的函式

func = dlsym(handle, "sub");

printf("%d - %d = %d\n", a, b, func(a, b));

func = dlsym(handle, "mul");

printf("%d * %d = %d\n", a, b, func(a, b));

func = dlsym(handle, "div");

printf("%d / %d = %d\n", a, b, func(a, b));

dlclose(handle);//動態庫的引用計數減一

return 0;

}

編譯

gcc new_main.c -o new_main -ldl

注意要加上-ldl選項,以使用顯示呼叫相關的函式。

結果:

雖然顯示呼叫比隱式呼叫步驟要稍複雜點,但顯示呼叫更靈活。

動態庫是在主程式執行時才會呼叫庫裡面的函式,動態庫不用和程式一起編譯,所以更新起來方便,原來編譯好的程式不用重新編譯就可使用更新後的動態庫。而靜態庫就需要和程式一起編譯,更新起來就麻煩,庫更新則使用庫的程式也需要更新。另,靜態庫是被編譯到程式中的,所以編譯後程式較大。相比較而言使用動態庫的程式就比較小。

總結:1.使用動態庫的程式無需更新,只需要更新動態庫。而使用靜態庫的程式還需重新編譯。2.使用動態庫的程式更小。

參考文章:

linux下動態庫的編譯使用

linux下動態庫的編譯 1 實踐 test cl.c 1 include 2 include 3 4 extern int add int a,int b 5 define labeladdr 6 main 7 test so.c 1 int add int a,int b 2 test so1....

Linux下動態庫使用小結

1.靜態庫和動態庫的基本概念 靜態庫,是在可執行程式連線時就已經加入到執行碼中,在物理上成為執行程式的一部分 使用靜態庫編譯的程式執行時無需該庫檔案支援,都可以用,但是生成的可執行檔案較大。動態庫,是在可執行程式啟動時載入到執行程式中,可以被多個可執行程式共享使用。使用動態庫編譯生成的程式相對較小,...

Linux下動態庫使用小結

1.靜態庫和動態庫的基本概念 靜態庫,是在可執行程式連線時就已經加入到執行碼中,在物理上成為執行程式的一部分 使用靜態庫編譯的程式執行時無需該庫檔案支援,都可以用,但是生成的可執行檔案較大。動態庫,是在可執行程式啟動時載入到執行程式中,可以被多個可執行程式共享使用。使用動態庫編譯生成的程式相對較小,...