qt動態鏈結庫so的生成與呼叫

2021-09-27 03:36:46 字數 1479 閱讀 4296

linux下qt建立和呼叫共享庫檔案.so

費了點功夫,總算get了編寫共享庫(shared library,windows下稱為「動態鏈結庫」,即dynamic link library)和呼叫的這個新技能!

動態鏈結庫的好處是不言而喻的,乙個稍微複雜一點的程式,頂層設計的時候良好的類庫劃分可以讓工作變得很簡單,而將不同類編譯成共享庫檔案可以實現程式的模組化,提高**復用程度,在保證介面相容的情況下更新乙個程式只用更新共享庫(windows下是dll,linux下常見的是so)即可。

下面以linux下的qt creator這個ide為例,講述qt(嚴格意義上是c++)共享庫檔案的編譯和呼叫。

建立共享庫專案

新建乙個qt creator專案,libraries -> c++ library,型別為shared library,一路next,選取模組的時候按需要選擇,預設僅選擇qtcore模組(如果你要包含ui,必須選擇qtgui),我建立的共享庫專案名為plugintest。

雙擊開啟專案的plugintest_global.**件,我加入了一行:

#include非必須

***_global.h是所有library專案都有的標頭檔案,選取要用的qt模組的包含宣告也在該檔案內。

按需編輯plugintest.h和plugintest.cpp,這個就是該共享庫專案的plugintest類了,我加入了乙個helloword()公共函式,內容為:

std::cout<<「hello world!」《儲存並編譯專案吧,沒問題的話會在build-plugintest-desktop-debug目錄裡生成libplugintest.so.1.0.0共享庫檔案和libplugintest.so、libplugintest.so.1、libplugintest.so.1.0這幾個軟鏈結。

呼叫共享庫的專案

修改已有的專案pro檔案,或者新建乙個普通的qt console專案然後修改它的pro檔案,加入下面幾行:

我之前qt的文章提到過的,includepath新增了pluginttest專案的目錄,以便找到標頭檔案,而libs新增的是共享庫檔案,-l新增目錄,-l指定共享庫名稱(注意是共享庫專案名而非共享庫檔名),之前一直失敗就是錯在libs這裡。

修改一下main.cpp呼叫plugintest的helloworld()試試看吧,main.cpp內容如下:

int main(int argc, char *ar**)

儲存編譯專案然後執行。不出意外就會得到hello world!的輸出了,修改plugintest專案的helloworld()函式重新編譯該共享庫,執行主程式就會得到不同的輸出結果(不用重新編譯主程式),這就是共享庫(動態鏈結庫)的好處所在。

備註:在linux中軟連線的存在主要是為了解決動態庫的版本問題,在我所用到的qt生成的動態庫方面,無論是使用libplugintest.so、libplugintest.so.1、libplugintest.so.1.0,libplugintest。1.0.0 中的任何乙個均可實現相同效果。

so動態鏈結庫生成 呼叫

linux下檔案的型別是不依賴於其字尾名的,但一般來講 o,是目標檔案,相當於windows中的.obj檔案 so 為共享庫,是shared object,用於動態連線的,和dll差不多 a為靜態庫,是好多個.o合在一起,用於靜態連線 1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。這裡...

Qt呼叫VC 生成的動態鏈結庫

qt如何呼叫vc 生成的動態鏈結庫?假設當前有vc 編譯器生成的動態庫檔案testdll.h,testdll.lib和testdll.dll。testdll.h檔案原始碼如下 ifdef testdll exports define testdll api declspec dllexport el...

Qt呼叫VC 生成的動態鏈結庫

qt如何呼叫vc 生成的動態鏈結庫?假設當前有vc 編譯器生成的動態庫檔案testdll.h,testdll.lib和testdll.dll。testdll.h檔案原始碼如下 ifdef testdll exports define testdll api declspec dllexport el...