Linux 動態鏈結庫 so 的使用

2021-09-22 13:40:50 字數 2352 閱讀 9840

1. 背景

庫:就是已經編寫好的,後續可以直接使用的**。

c++靜態庫:會合入到最終生成的程式,使得結果檔案比較大。優點是不再有任何依賴。

c++動態庫:動態庫,乙個檔案可以多個**同時使用記憶體中只有乙份,節省記憶體,可以隨主**一起編譯。缺點是需要標頭檔案。

網友說:庫就是除了main函式之外的其他**,都可以組成庫。

2. 只介紹動態庫(工作中主要用動態庫) 

c++使用動態庫比c語言使用動態庫稍微麻煩點。

因為c++支援函式過載(引數變數個數不同、引數型別不同、型別修飾符不同const/not const等),都會使得c++對函式名進行重寫,不方便根據函式名查詢對應函式

c++中可以使用extern關鍵字修飾對應的函式,表示函式名按照c言語分隔編譯,不進行改寫。(extern關鍵字另乙個關鍵字修飾變數,表示變數在其他檔案中已經定義。通常見於修飾全域性變數)

3. 使用so檔案需要的api

標頭檔案 #include

4. c++使用動態鏈結庫例項

4.1 test.h

1

class

test;

4.2 test.cpp

1 #include 2 #include "

test.h"3

4int

g_num= 0

; ///全域性變數56

int test::get()

7void test::set(const

int num)89

#ifdef __cplusplus

10extern "c"

1415

#ifdef __cplusplus16}

17#endif

4.3 main.cpp

1 #include 2 #include 3 #include "

test.h"4

using

namespace

std;56

//宣告函式指標

7 typedef test* (*so_init)();89

//定義外掛程式類來封裝,控制代碼用完後需要釋放

10struct

plugin

15 ~plugin()

17if

(handle) 18}

19};

2021

int create_instance(const

char *so_file, plugin &p)

3031

//根據字串"create"讀取庫中對應到函式, 並返回函式位址,可以理解為一種間接的「反射機制

32 so_init create_fun = (so_init) dlsym(p.handle, "

create");

33if (!create_fun)

3839

//呼叫方法, 獲取類例項

40 p.t =create_fun();

4142

return0;

43}4445

intmain()

5455 p1.t->set(1); //

對庫1中到全域性變數進行設定

56 p2.t->set(2); //

對庫2中到全域性變數進行設定

5758

//輸出兩個庫中的全域性變數

59 cout << "

t1 g_num is

"<< p1.t->get() <

60 cout << "

t2 g_num is

"<< p2.t->get() <

61return0;

62 }

執行:

Linux C C 如何使用 so動態鏈結庫?

在某些時候,您可能必須在執行時載入庫才能使用其功能。在為程式編寫某種外掛程式或模組體系結構時,這種情況最常見。在linux c c 語言中,載入庫非常簡單,只需呼叫dlopen,dlsym和dlclose就足夠了。動態裝載庫api 動態庫的執行時載入時通過一系列由動態鏈結器 dynamic link...

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

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

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

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