本文以一個簡單的例子,介紹linux下動態庫的創建和使用操作。其中就無法找到動態庫文件的問題簡單介紹處理辦法。
動態鏈接庫文件在windows平台下往往以.dll為后綴,而在linux平台則一般以.so為后綴,so是shared object的縮寫。
感覺在linux下構建動態鏈接庫文件比在windows下省點功夫,使用gcc編譯器的話,只需簡單地在gcc命令行參數中加上-shared選項
以下是一個簡單的例子:三個文件libtest.h, libtest.c和main.c。
libtest.c定義動態庫函數,main.c調用動態庫函數, 為簡單起見,這三個文件保存在同一個目錄中。
/*libtest.h*/
void test(void);
/*libtest.c*/
#include “stdio.h”
#include "libtest.h"
void test(void)
{
printf("run test() in libtest.so\n");
}
/*main.c*/
#include "libtest.h"
int main(void)
{
test();
return 0;
}
以下是創建動態庫文件的操作:
1、進入以上源文件所在目錄
2、執行gcc -fpic -shared -o libtest.so libtest.c
3、執行ls可發現當前目錄下多了一個libtest.so的文件, 執行file libtest.so將打印該文件是一個ELF LSB shared-object file.
說明:步驟2的選項-fpic表明創建的動態庫文件是position independent code
以下是編譯並生成main可執行程序的操作:
1、執行gcc main.c -L. -ltest -o main
2、執行ls將發現當前目錄下多了一個main可執行文件。
3、執行ldd main來打印main可執行文件的動態庫依賴關系表。
如果在打印出現的信息中,你發現有一行:libtest.so => not found
則表明鏈接程序找不到我們的libtest.so文件哦,為什么呢?因為鏈接程序只尋找固定目錄,例如/lib目錄。如果我們的當前目錄是諸如/home/yls/aaa/bbb/ccc這種目錄,那么人家是不會主動了解到的。怎么辦?
辦法一:把libtest.so拷貝到鏈接程序的搜索路徑目錄下()。
a、放到usr/local/lib 下(推薦放在這個路徑下) /lib一般放的為系統相關的.so
b、然后 執行 :ldconfig
辦法二:設置環境變量LD_LIBRARY_PATH,增加當前路徑到該變量中。
看看現在LD_LIBRARY_PATH有什么內容吧?執行echo $LD_LIBRARY_PATH就打印出來。
配置環境變量的方法簡單點就是:
LD_LIBRARY_PATH=LD_LIBRARY_PATH:"/home/yls/aaa/bbb/ccc";
export LD_LIBRARY_PATH
好了,再次執行ldd就有新發現了。
4、執行./main, OK,輸出正常。
如此完成一次動態庫建立和調用。
