linux 下建立動態鏈結庫的乙個很簡單的例子

2021-06-16 16:47:53 字數 1667 閱讀 1451

在目錄 /usr/local/src/so_lib_test 下面建立三個檔案: libtest.h, libtest.c, test_main.c

libtest.h 的內容為:

/* 這裡只宣告了乙個函式 */

int add(int, int);

libtest.c 的內容為:

#include "libtest.h"

int add(int a, int b)

test_main.c 的內容為:

#include #include #include int main(int argc, char **argv)

else

printf("dlopen() function load libtest.so succeeded!\n");

dlerror(); /* clear any existing error */

*(void **) (&lpadd) = dlsym(handle, "add");

if ((error = dlerror()) != null)

else

printf("get functino offset address succeeded!\n");

printf("add(3,7) function output is: %d\n", (*lpadd)(3, 7));

if (dlclose(handle))

else

printf("dlclose() function close dynamic link library succeeded!\n");

return 0;

}

執行命令 gcc libtest.c -fpic -shared -o libtest.so

在當前目錄下會生成乙個名為 libtest.so 的動態庫檔案。

執行命令 gcc -o test_main  test_main.c -l. -ltest -ldl

在當前目錄下會生成乙個名為 test_main 的可執行檔案

執行命令 ./test_main

error while loading shared libraries: libtest.so: cannot open shared object file: no such file or directory

這是因為需要告訴作業系統到**才能找到 libtest.so 檔案,執行命令

export ld_library_path=$ld_library_path:/usr/local/src/so_lib_test

(除了使用這條命令之外還有其他方法,這裡就不介紹了)

再執行命令 ./test_main

可以看到以下輸出

dlopen() function load libtest.so succeeded!

get functino offset address succeeded!

add(3,7) function output is: 10

dlclose() function close dynamic link library succeeded!

對於 dlopen(), dlsym(), dlclose() 函式的用法,在網頁: 上有詳細介紹

Linux下動態鏈結庫建立問題

1 將幾個需要編譯成動態鏈結庫的原始檔比編譯 例如有 test1.c test2.c main.c,那麼使用下面命令 gcc test1.c test2.c fpic shared o libtest.so 注意裡面的兩個選項 fpic shared 2 編譯main.c gcc o main ma...

Linux下動態鏈結庫和靜態鏈結庫

第一部分 編譯過程 預處理過程,負責標頭檔案展開,巨集替換,條件編譯的選擇,刪除注釋等工作。gcc e表示進行預處理。編譯過程,負載將預處理生成的檔案,經過詞法分析,語法分析,語義分析及優化後生成彙編檔案。gcc s表示進行編譯。彙編,是將彙編 轉換為機器可執行指令的過程。通過使用gcc c或者as...

建立靜態鏈結庫 動態鏈結庫

下面的實操中的動態庫或者靜態庫名都用wujunwu 第一步 建立乙個源 建立靜態鏈結庫的源 include void func1 void int func2 int x,int y 第二步 建立乙個.件作為函式宣告 void func1 void intfunc2 int x,int y 第三步 ...