Linux動態鏈結庫 so檔案的建立與使用

2021-06-07 09:48:52 字數 1790 閱讀 4482

本文以乙個簡單的例子,介紹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)

/*main.c*/

#include "libtest.h"

int main(void)

以下是建立動態庫檔案的操作:

1、進入以上原始檔所在目錄

2、執行gcc libtest.c -fpic -shared -o  libtest.so

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拷貝到鏈結程式的搜尋路徑目錄下。

辦法二:設定環境變數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)搜尋路徑

Linux 動態鏈結庫 so 的使用

1.背景 庫 就是已經編寫好的,後續可以直接使用的 c 靜態庫 會合入到最終生成的程式,使得結果檔案比較大。優點是不再有任何依賴。c 動態庫 動態庫,乙個檔案可以多個 同時使用記憶體中只有乙份,節省記憶體,可以隨主 一起編譯。缺點是需要標頭檔案。說 庫就是除了main函式之外的其他 都可以組成庫。2...

Linux下的動態鏈結庫 so檔案的使用

大家都知道,在windows系統中有很多的動態鏈結庫 以.dll為字尾的檔案,dll即dynamic link library 這種動態鏈結庫,和靜態函式庫不同,它裡面的函式並不是執行程式本身的一部分,而是根據執行程式需要按需裝入,同時其執行 可在多個執行程式間共享,節省了空間,提高了效率,具備很高...

linux下檢視動態鏈結庫so檔案的依賴的相關組建

我們很多c程式在windows下是以dll形式展現的,在linux則是以so 形式展現的。windows一般不會因為編譯dll檔案的編譯器版本不同而出先dll檔案不能執行。但是linux下,不同版本核心的linux下編譯的c程式,在其他版本的linux下就容易出現無法執行的問題。主要可能是支援程式的...