1. 程式人生 > >Linux下使用QT編寫和呼叫動態連結庫(.so檔案)

Linux下使用QT編寫和呼叫動態連結庫(.so檔案)

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.h檔案,我加入了一行:

 	
#include <iostream>

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

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


std::cout<<"Hello World!"<<std::endl;

儲存並編譯專案吧,沒問題的話會在build-pluginTest-Desktop-Debug目錄裡生成libpluginTest.so.1.0.0共享庫檔案和libpluginTest.so、libpluginTest.so.1、libpluginTest.so.1.0這幾個軟連結。

呼叫共享庫的專案

修改已有的專案pro檔案,或者新建一個普通的Qt Console專案然後修改它的pro檔案,加入下面幾行


INCLUDEPATH += /home/will/Projects/pluginTest/
 
LIBS += -L/home/will/Projects/build-pluginTest-Desktop-Debug -lpluginTest

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

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

#include <QCoreApplication>
#include "plugintest.h"//包含plugintest.h標頭檔案
 
int
main(int
argc, char
*argv[])
{
    QCoreApplication a(argc, argv);
    PluginTest test;//PluginTest是plugintest.h中定義的類名
    test.helloworld();//呼叫helloworld
    //return a.exec();
}

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