linux 下創建動態鏈接庫的一個很簡單的例子

在目錄 /usr/local/src/so_lib_test 下面創建三個文件: libtest.h, libtest.c, test_main.c
libtest.h 的內容爲:
  1. /* 這裏只聲明瞭一個函數 */  
  2. int Add(intint);  
libtest.c 的內容爲:
  1. #include "libtest.h"  
  2.   
  3. int Add(int a, int b)  
  4. {  
  5.   return ((a)+(b));  
  6.   }  
test_main.c 的內容爲:

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <dlfcn.h>  
  4.   
  5. int main(int argc, char **argv)  
  6. {  
  7.    void *handle;  
  8.    int (*lpAdd)(intint);  
  9.    char *error;  
  10.   
  11.    if ( !(handle = dlopen("libtest.so", RTLD_LAZY)) )  
  12.    {  
  13.      fprintf(stderr, "%s\n", dlerror());  
  14.      return 1;  
  15.     }  
  16.    else  
  17.      printf("dlopen() function load libtest.so succeeded!\n");  
  18.   
  19.    dlerror();    /* Clear any existing error */  
  20.    *(void **) (&lpAdd) = dlsym(handle, "Add");  
  21.    if ((error = dlerror()) != NULL)  
  22.    {  
  23.      fprintf(stderr, "%s\n", error);  
  24.      return 1;  
  25.     }  
  26.    else  
  27.      printf("Get functino offset address succeeded!\n");  
  28.   
  29.    printf("Add(3,7) function output is: %d\n", (*lpAdd)(3, 7));  
  30.   
  31.    if (dlclose(handle))  
  32.    {  
  33.      error = dlerror();  
  34.      fprintf(stderr, "%s\n", error);  
  35.      return 1;  
  36.      }  
  37.    else  
  38.      printf("dlclose() function close dynamic link library succeeded!\n");  
  39.   
  40.    return 0;  
  41. }  

執行命令 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() 函數的用法,在網頁: http://linux.die.net/man/3/dlopen 上有詳細介紹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章