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
14.2 test.cppclass
test;
1 #include 2 #include "4.3 main.cpptest.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
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...