Linux動態鏈接庫.so文件的創建與使用


本文以一個簡單的例子,介紹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,輸出正常。

如此完成一次動態庫建立和調用。

 

Linux動態鏈接庫的創建與使用

LINUX系統中命令創建與使用動態鏈接庫

Linux 動態庫與靜態庫制作及使用詳解

Linux動態庫(.so)搜索路徑


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM