如何靜態編譯、鏈接Qt 5


本文討論的將是MinGW之上的靜態編譯,並且將拋開萬年難伺候的QtWebkit進行編譯。

一、編譯Qt 5.0

與Qt 4.x不同的地方:

1、Qt 5.0比以往相比,需要有perl環境。因此要在你的環境變量中添加perl。

2、configure當中去除了一些參數,比如no-webkit,同時又添加了一些,比如icu。

3、Webkit和QtCore都需要ICU。ICU是一個處理unicode的庫,如果你沒有准備,webkit的編譯自動跳過,core的編譯使用其它方法避開ICU。

4、由於QPA的存在,與平台相關的部分被抽象成了插件,這個后面再說。

5、默認啟用了ANGLE作為OpenGL和DirectX之間的橋梁,如果你沒有准備ANGLE,需要額外的-opengl desktop參數

6、默認支持C++11。基於此,推薦使用支持C++11的編譯器。我這里使用的是TDM的32位版本,有興趣的可以在這里找到:http://tdm-gcc.tdragon.net/

 

靜態編譯Qt最基本的需要將gcc的幾個dll變成靜態鏈接,因為我使用了TDM,所以沒有這方面的后顧之憂,如果你使用原始的gcc,是需要修改mkspecs中的make.conf的,給gcc傳入參數-static-libgcc的。

同時也請注意,如果你需要一同編譯debug版本,不要編譯靜態的。

我所使用的configure:

configure -release -static -opensource -qmake -prefix "..\qt5\qt5-x86-static" -c++11 -platform win32-g++ -qt-zlib -qt-libpng -qt-libjpeg -qt-style-windowsxp -qt-style-windowsvista -nomake tests -nomake demos -nomake examples -opengl desktop

二、靜態鏈接

Qt 5.0重新翻修了插件部分,並且修改了部分宏的作用,以及上面提及的第4點。因此,和Qt 4.x的鏈接有些不同,我們需要在自己的pro當中這樣寫:

CONFIG+=static
static{
QTPLUGIN+=qwindows qico
DEFINES+=QT_PLUGIN_STATIC_LINK
LIBS+=-L"$(QTDIR)/plugins/platforms"
LIBS+=-L"$(QTDIR)/plugins/imageformats"
message("Staticbuild.")
}


這里說明一下。這個qmake片段只在static時候執行。因為前面特地寫了CONFIG+=static的關系,這里的static{}才得以執行。QTPLUGIN宏引入兩個插件,這使得這兩個庫將被納入鏈接;DEFINES定義了一個宏,這個宏我們需要在代碼中用到;LIBS兩行分別引入兩個插件庫的路徑;最后一行是個提示語。

現在,打開main.cpp或者新建一個cpp,寫入如下內容:

#ifdef QT_PLUGIN_STATIC_LINK
#include<QtCore/QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
Q_IMPORT_PLUGIN(QICOPlugin);
#endif

注意,這里就是和Qt 4.x最大的不同。原有的Q_IMPORT_PLUGIN宏需要的是插件名,而從Qt5開始則變成了插件的類名。另外這里的分號是我額外加上的,不加也可以,但Qt Creator會提示有問題。

這里面的qwindows對應的就是QWindowsIntegrationPlugin,而qico對應的則是QICOPlugin。

現在程序應該可以正常鏈接、運行了。

 

三、參考

http://www.formortals.com/build-qt-static-small-microsoft-intel-gcc-compiler/

http://www.formortals.com/how-to-statically-link-qt-4/

http://lists.qt-project.org/pipermail/releasing/2012-July/000401.html

https://bugreports.qt-project.org/browse/QTBUG-24496

https://github.com/lordmulder/LameXP/commit/255b21ab2c318f9754582eff8bc03a2eff2f4111

https://blog.qt.digia.com/blog/2012/05/08/qt-commercial-support-weekly-19-how-to-write-your-own-static-library-with-qt-2/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM