Qt項目發佈的exe程序,默認是以動態連接形式的,這樣發佈後的程序會附帶好多Qt本身的dll庫,這樣文件數量不只多,並且移植到其餘電腦上的時候,還可能會遇到,提示缺其餘庫等各類運行不起來的狀況。固然辦法仍是有的,找到全部用到的庫一塊隨着exe發佈就能夠了。其實還有一種方法就是用靜態編譯發佈程序。
下面是靜態編譯的流程。
文件準備
一、安裝VS2013
二、安裝python2.7,並設置環境變量
三、下載Qt5.4.2源碼文件,名字爲
qt-everywhere-opensource-src-5.4.2.zip
lib庫
五、下載openssl,去官網下載最新版便可
在D盤下新建文件夾
qt-static-build
將Qt源碼解壓到
D:\qt-static-build\qt\qt-everywhere-opensource-src-5.4.2
將icu解壓到
D:\qt-static-build\icu
文件修改
六、找到
F:\Qt\
qt-everywhere-opensource-src-5.4.2
\qtbase\mkspecs\win32-msvc2013\qmake.conf 文件,將原來的
QMAKE_CFLAGS_RELEASE = -O2 -MD -Zc:strictStrings
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi -Zc:strictStrings
QMAKE_CFLAGS_DEBUG = -Zi -MDd
改成
QMAKE_CFLAGS_RELEASE = -O2 -MT -Zc:strictStrings
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi -Zc:strictStrings
QMAKE_CFLAGS_DEBUG = -Zi -MTd
就是要將MD編譯模式給爲MT編譯模式。
開始命令操做
七、找到開始菜單 全部程序->
Visual Studio 2013->Visual Studio Tools->VS2013 開發人員命令提示,打開「VS2013 開發人員命令提示
」。
八、輸入命令:cd
D:\qt-static-build\qt\qt-everywhere-opensource-src-5.4.2
,輸入命令:
F:
九、輸入命令:
set PATH=C:\Windows;C:\Windows\System32;C:\Ruby22\bin;C:\Python27;C:\Python27\Scripts;D:\qt-static-build\icu\lib;D:\qt-static-build\icu\bin;D:\qt-static-build\gles_sdk\x86;C:\Perl\bin;D:\qt-static-build\ssl\bin;
set INCLUDE=D:\qt-static-build\icu\include;D:\qt-static-build\gles_sdk\include;D:\qt-static-build\ssl\include;
set LIB=D:\qt-static-build\icu\lib;D:\qt-static-build\gles_sdk\x86;D:\qt-static-build\ssl\lib;
"D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
10
、執行configure命令,輸入:
configure -confirm-license -opensource -platform win32-msvc2013 -debug-and-release -static-prefix "D:\qt-static-build\Qt5.4.2-static-vs2013"-qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug -no-angle -nomake tests -nomake examples -icu -openssl
11
、上面的命令執行完後,輸入命令:
nmake
,而後就是漫長的等待了,要幾個小時呢。
十二、
nmake
執行完後,輸入命令:nmake install
到此編譯QT的過程已經完成了。這時候你會在
D:\qt-static-build
裏面找到文件夾
Qt5.4.2-static-vs2013
,這裏面的全部東西都是咱們靜態後生成的文件。
下面是QWebKit的編譯
先說下遇到的坑吧,不想看的能夠忽略。
一、MTd與MDd不匹配的錯誤提示,這個問題我找了好長時間,緣由我知道,是由於QWebKit是以MDd形式編譯的,可是就是
不知道爲何要以MDd形式編譯,後來我搜了下,發現Makefile文件裏的參數是MD,我曾經想過要把全部Makefile裏面的MD都改爲MT
,可是感受這個不靠譜,由於這些Makefile文件是動態生成的,因此確定是生成的過程出問題了。搞了好長時間,後來發現是環境變量的
問題,因爲我以前是用從官網下的exe文件安裝的Qt,當時將qmake.exe所在的bin目錄放到了環境變量裏面。我將這個環境變量刪掉,
換成上面靜態編譯後生成的qmake.exe所在的bin目錄(
F:\Qt\Qt5.4.2-static-vs2013\bin
),這個問題就解決了。
二、安裝bison的時候我放到了
Program Files (x86)這個目錄下面,結果命令行就將這個路徑當成兩個命令來處理了。就提示報錯了
沒找到命令。這真實太坑了。把它安裝到不包含空格的目錄裏就行了。
先準備要用到的軟件
一、
ActivePerl-MSWin32.msi
二、
bison-setup.exe
三、
gperf-bin.zip
四、
rubyinstaller.exe
五、
win_flex_bison.zip
因爲編譯過程當中用到了上面的命令,因此這些軟件是缺一不可的。裝完以後,記得要添加環境變量
上面的命令工具不要關,
執行下面命令
set PATH=%PATH%D:\qt-static-build\Qt5.4.2-static-vs2013\bin;
set INCLUDE=%INCLUDE%D:\qt-static-build\Qt5.4.2-static-vs2013\include;
而後執行命令(若是要編譯成release,將--debug改爲--release便可)
perl D:\qt-static-build\qt\qt-everywhere-opensource-src-5.4.2\qtwebkit\Tools\Scripts\build-webkit --qt --debug --prefix=D:\qt-static-build\Qt5.4.2-static-vs2013
執行一次後,會暫停下來,再執行一次便可。
而後就是再次漫長的等待了!
期間碰到了下面的幾個錯誤:
錯誤 一、
解決辦法是:找到 F:\QT\qt-everywhere-opensource-src-5.4.2\qtwebkit\
Source\WebCore\platform\text\TextEncodingRegistry.cpp:301
改 #if OS(WINDOWS) 爲 #if OS(WINCE)
錯誤 二、
解決辦法是:找到
F:\QT\qt-everywhere-opensource-src-5.4.2\qtwebkit\Source\WebCore\platform\qt\QtTestSupport.h
修改:
#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT Q_DECL_EXPORT
#else
#define TESTSUPPORT_EXPORT Q_DECL_IMPORT
#endif
爲
#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT /*Q_DECL_EXPORT*/
#else
#define TESTSUPPORT_EXPORT /*Q_DECL_IMPORT*/
#endif
而後從新執行上面的命令。
最後執行下面的命令,將生成的libs和頭文件放到
D:\qt-static-build\Qt5.4.2-static-vs2013
裏面
cd F:\QT\qt-everywhere-opensource-src-5.4.2\qtwebkit\WebKitBuild\Debug
nmake install
至此,整個Qt和QWebKit已經編譯完成。
我將文件組織了下
在
D:\qt-static-build\Qt5.4.2-static-vs2013
裏面新建目錄 thirdpart 將上面的icu和ssl文件夾複製到裏面,而後新建webkit目錄,將webkit用到的庫複製到裏面
如圖:
下面來新建項目測試一下
添加環境變量
變量名:
QTDIR-STATIC
變量值:
D:\qt-static-build\Qt5.4.2-static-vs2013
用VS2013建立項目
一、打開VS2013,文件 -> 新建項目 -> 模塊 -> Visual C++ -> Win32 -> Win32 項目,輸入項目名稱QtStaticTest,點擊肯定按鈕,建立一個新項目。而後在Win32 應用程序嚮導裏面選擇新項目,點擊完成。如圖:
二、修改項目屬性,右擊 項目 -> 屬性,打開屬性頁面。
配置屬性 -> C/C++ -> 常規 附加包含目錄,修改成
$(QTDIR-STATIC)/include,如圖:
配置屬性 -> C/C++ -> 代碼生成 運行庫,改成MTd
,如圖:
配置屬性 ->
連接器 -> 常規 附加庫目錄,添加
$(QTDIR-STATIC)\lib
$(QTDIR-STATIC)\plugins\platforms
$(QTDIR-STATIC)\plugins\imageformats
$(QTDIR-STATIC)\plugins\bearer
$(QTDIR-STATIC)\thirdpart\icu\lib
$(QTDIR-STATIC)\thirdpart\ssl\lib
$(QTDIR-STATIC)\thirdpart\webkit\lib
,如圖:
配置屬性 ->
連接器 -> 輸入 附加依賴項,添加如下內容:
/OPT:REF
qtmaind.lib
Qt5Cored.lib
Qt5Guid.lib
Qt5Widgetsd.lib
Qt5PlatformSupportd.lib
Qt5OpenGLd.lib
Qt5WebKitd.lib
Qt5WebKitWidgetsd.lib
Qt5MultimediaWidgetsd.lib
Qt5PrintSupportd.lib
Qt5Networkd.li
Qt5Sensorsd.lib
Qt5Sqld.lib
Qt5Positioningd.lib
Qt5Multimediad.lib
qwindowsd.lib
qddsd.lib
qicnsd.lib
qicod.lib
qjp2d.lib
qmngd.lib
qtgad.lib
qtiffd.lib
qwbmpd.lib
qwebpd.lib
WebKit1d.lib
WebCored.lib
version.lib
ANGLEd.lib
leveldbd.lib
JavaScriptCored.lib
WTFd.lib
sicuind.lib
sicuucd.lib
sicudtd.lib
winspool.lib
shlwapi.lib
rpcrt4.lib
comdlg32.lib
oleaut32.lib
imm32.lib
winmm.lib
glu32.lib
opengl32.lib
gdi32.lib
qtharfbuzzngd.lib
qgenericbearerd.lib
qnativewifibearerd.lib
dnsapi.lib
crypt32.lib
kernel32.lib
user32.lib
shell32.lib
uuid.lib
ole32.lib
advapi32.lib
ws2_32.lib
mpr.lib
這裏面有的庫,可能用不到,你們可自行刪除。
如圖:
三、新建文件main.cpp。添加如下內容:
#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QMainWindow>
#include <QtWebKitWidgets/QWebView>
#ifdef QT_STATIC
#include <QtCore/QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
Q_IMPORT_PLUGIN(QDDSPlugin)
Q_IMPORT_PLUGIN(QICNSPlugin)
Q_IMPORT_PLUGIN(QICOPlugin)
Q_IMPORT_PLUGIN(QJp2Plugin)
Q_IMPORT_PLUGIN(QMngPlugin)
Q_IMPORT_PLUGIN(QTgaPlugin)
Q_IMPORT_PLUGIN(QTiffPlugin)
Q_IMPORT_PLUGIN(QWbmpPlugin)
Q_IMPORT_PLUGIN(QWebpPlugin)
Q_IMPORT_PLUGIN(QGenericEnginePlugin)
Q_IMPORT_PLUGIN(QNativeWifiEnginePlugin)
#endif // QT_STATIC
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow* window = new QMainWindow();
window->resize(500, 450);
QPushButton* btn = new QPushButton(window);
btn->setText("Hello World!");
btn->setGeometry(10, 10, 80, 20);
QWebView* webView = new QWebView(window);
webView->setGeometry(100, 15, 350, 420);
webView->setUrl(QUrl("http://www.163.com"));
window->show();
return app.exec();
}
運行,如圖:
好了,一個Hello World已經成功運行了。
注意一點,用到的Plugins要經過Q_IMPORT_PLUGIN,導入進去。不然的話就會報錯了。
有人會問,上面要引用那麼多lib文件我是怎麼知道的,其實我是先經過QtCreator建立一個項目,成功編譯並運行後,經過命令
qmake -r -spec win32-msvc2013 -tp vc 轉化爲VS2013項目,而後啓動後,查看項目屬性才知道的。