關於使用QLibrary如何讀取共享庫

2021-06-09 00:43:45 字數 1473 閱讀 2084

現在程式講究個模組化,外掛程式化,所有共享庫的讀取變的尤其關鍵,把程式寫成各種各樣的共享庫,那公升級的時候只需要重寫下某個庫,在保證標頭檔案不變的情況下,更新上去,就能完美執行。qt中讀取使用共享庫的類叫qlibrary. 使用起來也相當簡單,最基本的使用只需要知道4個函式,load(), isload(), revovle()和unload().在絕大部分情況下,下面這四個函式就足夠完成工作了。下面是個小例子:

// 庫名是mylib.so,這個檔案字尾可以不加

// qt會根據作業系統自動新增字尾

qlibrary lib("mylib");

// 這是最重要的地方,根據你要呼叫的庫函式先定義乙個相同的函式指標

typedef (mytype *)(instanceof)();

// instanceof是你要讀取的庫中的函式名字

instanceof instance = (instanceof)lib.revolve("instanceof");

// revolve成功則執行函式

// 不成功則輸出錯誤字串

if(instance)

mytype *ret = instance();

else

qdebug() << lib.errorstring();

這裡並沒有使用到load()函式,這是因為revolve()函式會自動去載入庫,同時qt還給出了乙個簡單的static函式來讀取庫中的函式:

typedef (mytype *)(instanceof)();

instanceof instance = qlibrary::revolve("mylib","instanceof");

if(instance)

mytype *ret = instance();

最後要著重說明的就是,qlibrary只能讀取共享庫內的c函式,這是因為c++為了達到物件導向程式設計封裝,繼承,多型等特性,實際的symbol table和你定義的是不同的,他會在編譯過程中加入一些字元,比如上例中的instanceof函式,在symbol table中可能是"_zv12instanceof4fr"這樣的存在,所以如果把該函式宣告為簡單的類函式,qlibrary是找不到的,必須要將你準備讓qlibrary讀的函式宣告為c函式,如下

extern "c" mytype *instanceof()

這個函式返回mytype的乙個物件,這樣,只要你有相應的標頭檔案,就可以完全使用這個物件內的其他類函式了。

這個instanof函式必須定義在cpp檔案中,如果寫在.h檔案中,在生成庫的時候會報多重宣告的錯誤, 這原因我覺得有可能是因為qt的moc編譯器通過.h檔案生成乙個新的moc_*.cpp,之後在gcc上編譯庫的時候會使用到原始的.h,.cpp和這個生成的moc.cpp,這個instanof同時出現在原始的.h和生成的moc.cpp中就重複定義了。

使用QLibrary載入動態庫

使用qlibrary可以在程式執行時載入動態鏈結庫。乙個qlibrary的例項作用於乙個單一的共享庫上。qlibrary提供了一種平台無關的方式訪問庫中的函式。可以在構建qlibrary的例項時將要載入的庫檔案傳入,也可以在建立例項後使用setfilename 顯式的設定要載入的檔名。當載入庫檔案時...

使用QLibrary載入動態庫

使用qlibrary可以在程式執行時載入動態鏈結庫。乙個qlibrary的例項作用於乙個單一的共享庫上。qlibrary提供了一種平台無關的方式訪問庫中的函式。可以在構建qlibrary的例項時將要載入的庫檔案傳入,也可以在建立例項後使用setfilename 顯式的設定要載入的檔名。當載入庫檔案時...

QT 使用QLibrary載入動態庫

原文 1 win下動態庫呼叫有關的函式包括 1 loadlibrary,裝載動態庫。2 getprocaddress,獲取要引入的函式,將符號名或標識號轉換為dll內部位址。3 freelibrary,釋放動態鏈結庫。2 unix上與動態庫呼叫有關的函式包括 1 開啟動態鏈結庫 dlopen,函式原...