動態鏈結庫 so的編譯與使用

2022-03-25 00:08:34 字數 1608 閱讀 4838

動態鏈結庫*.so的編譯與使用- -

動態庫*.so在

linux

下用c和c++程式設計時經常會碰到,最近在**找了幾篇文章介紹動態庫的編譯和鏈結,總算搞懂了這個之前一直不太了解得東東,這裡做個筆記,也為其它正為動態庫鏈結庫而苦惱的兄弟們提供一點幫助。

1、動態庫的編譯

下面通過乙個例子來介紹如何生成乙個動態庫。這裡有乙個頭

檔案:so_test.h,三個.c檔案:test_a.c、test_b.c、test_c.c,我們將這幾個檔案編譯成乙個動態庫:libtest.so。

so_test.h:

#include 

#include 

void test_a();

void test_b();

void test_c();

test_a.c:

#include "so_test.h"

void test_a()

test_b.c:

#include "so_test.h"

void test_b()

test_a.c:

#include "so_test.h"

void test_c()

將這幾個檔案編譯成乙個動態庫:libtest.so

$ gcc test_a.c test_b.c test_c.c -fpic -shared -o libtest.so

2、動態庫的鏈結

test.c:

#include "so_test.h"

int main()

$ gcc test.c -l. -ltest -o test

l 測試是否動態連線,如果列出libtest.so,那麼應該是連線正常了

$ ldd test

l 執行test,可以看到它是如何呼叫動態庫中的函式的。

3、編譯引數解析

最主要的是gcc命令列的乙個選項:

-shared 該選項指定生成動態連線庫(讓聯結器生成t型別的匯出符號表,有時候也生成弱連線w型別的匯出符號),不用該標誌外部程式無法連線。相當於乙個可執行檔案

l -fpic:表示編譯為位置獨立的**,不用此選項的話編譯後的**是位置相關的所以動態載入時是通過**拷貝的方式來滿足不同程序的需要,而不能達到真正**段共享的目的。

l -l.:表示要連線的庫在當前目錄中

l -ltest:編譯器查詢動態連線庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱

l ld_library_path:這個環境變數指示動態聯結器可以裝載動態庫的路徑。

l 當然如果有root許可權的話,可以修改/etc/ld.so.conf檔案,然後呼叫 /sbin/ldconfig來達到同樣的目的,不過如果沒有root許可權,那麼只能採用輸出ld_library_path的方法了。

4、注意

呼叫動態庫的時候有幾個問題會經常碰到,有時,明明已經將庫的標頭檔案所在目錄 通過 「-i」 include進來了,庫所在檔案通過 「-l」引數引導,並指定了「-l」的庫名,但通過ldd命令察看時,就是死活找不到你指定鏈結的so檔案,這時你要作的就是通過修改ld_library_path或者/etc/ld.so.conf檔案來指定動態庫的目錄。通常這樣做就可以解決庫無法鏈結的問題了。

動態鏈結庫 so的編譯與使用

動態庫 so在linux下用c和c 程式設計時經常會碰到,最近在 找了幾篇文章介紹動態庫的編譯和鏈結,總算搞懂了這個之前一直不太了解得東東,這裡做個筆記,也為其它正為動態庫鏈結庫而苦惱的兄弟們提供一點幫助。1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。這裡有乙個標頭檔案 so test...

Linux 動態鏈結庫 so 的使用

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

GCC編譯生成動態鏈結庫 so檔案

動態庫 so在linux下用c和c 程式設計時經常會碰到,最近在 找了幾篇文章介紹動態庫的編譯和鏈結,總算搞懂了這個之前一直不太了解得東東,這裡做個筆記,也為其它正為動態庫鏈結庫而苦惱的兄弟們提供一點幫助。1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。這裡有乙個標頭檔案 so test...