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文件,加入下面幾行:
我之前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()函數重新編譯該共享庫,運行主程序就會得到不同的輸出結果(不用重新編譯主程序),這就是共享庫(動態鏈接庫)的好處所在。
備注:在linux中軟連接的存在主要是為了解決動態庫的版本問題,在我所用到的qt生成的動態庫方面,無論是使用libpluginTest.so、libpluginTest.so.1、libpluginTest.so.1.0,libpluginTest。1.0.0 中的任何一個均可實現相同效果。
