天天看點

靜态編譯qt4.8

本人是采用qt4.8版本測試的,5.0以後的版本請參考,不保證按以下方法能編譯通過。

win編譯:

1)安裝支援qt4.8版本的vs,測試中采用vs2010,先安裝vs2010;

2)下載下傳QT和qt-for-vs2010插件,qt-win-opensource-4.8.0-vs2010.exe,qt-vs-addin-1.1.10.exe,先安裝qt,再安裝vs的qt插件,安裝插件是請選擇支援vs2010.

3)在qt安裝目錄下,更改qmake.conf檔案,若怕修改錯,可預先備份,檔案所在路徑示意:C:\software\Qt\4.8.0\mkspecs\win32-msvc2010

修改:

QMAKE_CFLAGS_RELEASE    = -O2 -MD

QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi

QMAKE_CFLAGS_DEBUG      = -Zi -MDd

為:

QMAKE_CFLAGS_RELEASE    = -O2 -MT

QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi

QMAKE_CFLAGS_DEBUG      = -Zi –MTd

4)[可選]

a)如 果做了上一步,那麼就不需要嵌入manifest了,去掉CONFIG+= 後面的embed_manifest_dll embed_manifest_exe

b)VC預設是“将wchar_t 視為内置類型”的,是以建議去掉-Zc:wchar_t-, 否則以後用到一些與wchar_t有關的函數

(如fromWCharArray)時,就要在項目屬性裡設定“将wchar_t視為内置類型”為No了)。

注意:可選(a)選項對于一些中文路徑及緩存路徑會編譯出現中文亂碼異常而出現編譯錯誤

5)配置環境變量

管理者身份打開vs2010指令行:

(注意,如果用Visual Studio x64 Win64 Command Prompt (2010)編譯時,出來的是64bit的,如果工程項目用到32bit第三方庫會比較麻煩,建議Visual Studio Command Prompt (2010)編譯)

set QTDIR=c:\software\Qt\4.8.0

set PATH=%PATH%;C:\software\Qt\4.8.0\bin

set QMAKESPEC=win32-msvc2010

cd %QTDIR%

configure -platform win32-msvc2010 -debug-and-release -opensource -static -fast -qt-sql-odbc -qt-sql-sqlite -plugin-sql-sqlite -no-qt3support -qt-zlib -no-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-webkit -qt-style-windowsxp -qt-style-windowsvista

-nomake docs -nomake demos

[備注,上面指令可以自行配成.bat檔案調用,省去每次輸入的麻煩]

建議:

a)這裡不要把太多插件庫編譯進去,可等編譯好後再自行去plugins下編譯插件庫,例如資料庫插件庫-qt-sql-mysql -plugin-sql-mysql,因為編譯到多一半的時候會提示找不到mysql的一些檔案,還要下一些第三方的東西才能編譯qtsql庫,是以直接去掉,後續會介紹插件庫編譯方法)

b)可以configure -help可以顯示所有選項的幫助資訊,這裡羅列出一些,請看附錄

c)系統中使用者名是中文的情況:

在編譯過程中碰到的最大的問題是目錄名的問題,QT本身不支援漢語目錄名和帶空格的目錄名,就算源程式和編譯目錄滿足這個條件,然而QT在編譯過程中,會大量使用TEMP檔案,Window 7系統的TEMP目錄在C:\Users\[使用者名]\AppData\Local\Temp下,如果目前使用者是中文的名,在QT編譯過程中就是緻命的。最好的解決辦法就是吧window的TEMP目錄設定在根目錄下我就是設定在C:\TEMP 。(Windows下設定使用者的環境變量[不用改系統的],把裡面的TEMP 和TMP 全部設定成C:\TEMP)

6)編譯:

a)configure指令執行,會Do you accept the terms of the license?,輸入y并回車即可

b)configure指令成功會Qt is now configured for building. Just run nmake.;To reconfigure, run nmake confclean and configure.提示

c)進入下src目錄 或在目前目錄下,

($ cd src)

$ nmake

等待編譯.............

d)VS指令視窗下進行nmake進行編譯時有可能碰到如下提示:

   (1)Perl not found in environment - cannot run syncqt.  

   解決方法:将 bin 目錄中的 syncqt 和 syncqt.bat 兩個檔案改名或删除即可。

   編譯 Webkit 時會碰到 U1077錯誤,導緻編譯出錯,看輸出含義是說宏擴充後的字元串中包含有換行。

   解決方法:打開 src\3rdparty\webkit\Source\WebCore\platform\DefaultLocalizationStrategy.cpp,定位至 327行,将其中的 “<Section>” 給删除掉。

e)如果編譯過程中出現:

指令文法不正确。  

NMAKE : fatal error U1077:.....

可能是環境變量設定的CURR_DIR和TARGETDIR值中含有空格導緻了此問題。

通過下面的指令删除環境變量即可。

01.set CURR_DIR=  

02.set TARGETDIR=

f)不建議執行以下步驟:

備份 .qmake.cache 和 configure.cache,若不執行清理則無須備份;

執行如下指令清理:

(本步驟執行完成後會清理掉 src\corelib\global 目錄中的 qconfig.h 和 qconfig.cpp,)

 (導緻 QT項目不能正确編譯,是以不要執行。或是執行本指令之前将上述檔案先儲存至其他地方。)

nmake confclean

清理完成後将 .qmake.cache 和 configure.cache 移回原位,若不執行清理則無須本操作;

g)編譯完成後,就打開Qt 4.8.0 Command Prompt指令行就可進行qt程式的靜态編譯了qmake -o Makefile  xxx.pro && (nmake debug 或 nmake release)

linux靜态編譯(redhat6.5):

1)下載下傳源安裝程式,如 qt-everywhere-opensource-src-4.8.6.tar.gz

2)解壓:tar zxvf qt-everywhere-opensource-src-4.8.6.tar.gz

3)配置

a)進入解壓目錄,配置

./configure -static -release -prefix /usr/local/Qt-4.8.6_static -nomake demos -nomake examples -qt-zlib -qt-libpng -qt-libjpeg -qt-sql-MySQL -qt-sql-sqlite -plugin-sql-ODBC -plugin-sql-PostgreSQL -no-qt3support -no-opengl

[

如果配置時提示某些子產品不支援,可以先屏蔽掉或不添加這個子產品,後續在單獨編譯。

參數-static 指的是要采用靜态編譯Qt的方法

參數-release指的是隻編譯release版本的庫

參數-qt-zlib -qt-gif -qt-libpng -qt-libjpeg 是更好确定Qt編譯出的程式能在目前不知的系統下運作。

參數-nomake demos -nomake examples 指的是不編譯demos和examples

參數-qt-sql-sqlite 如果沒有這個參數,configure的時候,可能會提示sqlite 有問題而中止。

參數 -prefix /usr/local/Qt-4.8.6_static 指明靜态編譯的Qt安裝的目錄,命名Qt-4.8.6_static 是為了差別動态編譯安裝的Qt,因為如果沒有這個參數,安裝時會覆寫之前動态編譯安裝的Qt(如果有的話)。

]

b)      注意事項:

可選:

中文支援:ibus ibus-qt4 ibus-table

前置環境:build-essential libpcap0.8-dev libx11-dev libfreetype6-dev libavahi-gobject-dev libSM-dev libXrender-dev libfontconfig-dev libXext-dev

如果出現錯誤:

       Basic XLib functionality test failed!

      You might need to modify the include and library search paths by editing

       QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11

      解決辦法:yum install libX* 

      (如果是Ubuntu 也可運作sudo apt-get install libx11-dev libxext-dev libxtst-dev)

4)編譯:

make

sudo make install

5)增加(或改變)環境變量: (也可以不添加環境變量,使用絕對路徑進行編譯)

在你home目錄下你的的名字的目錄中,在.profile檔案中追加(或改變)如下環境變量:

(為Qt設定一些特定的環境變量,這個很重要!.profile檔案是隐藏的,可在你的名字目錄下,按Ctrl+H顯示所有檔案檢視到)

QTDIR=/usr/local/Qt-4.8.6_static/

PATH=$QTDIR/bin:$PATH   

MANPATH=$QTDIR/doc/man:$MANPATH   

LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH   

export QTDIR PATH MANPATH LD_LIBRARY_PATH 

7、重新開機,成功的話,下來用qmake&&make編譯以往的Qt程式看是否采用靜态編譯的。

關于插件庫的編譯:

1)以資料庫為例,其他類似,qt資料庫預設安裝sqlite驅動,

2)想使用QOCI需要先配置oracle-base-client庫,然後去qoci插件源代碼目錄(src/plugins/sqldrivers/oci,修改其*.pro,加入oci頭及庫路徑:

//////////oci.pro

TARGET = qsqloci

SOURCES = main.cpp

include(../../../sql/drivers/oci/qsql_oci.pri)

include(../qsqldriverbase.pri)

#自行新添加依賴庫,可在oracle官網下載下傳其用戶端base子產品

INCLUDEPATH += /home/myuser/instantclient_12_1/sdk/include

LIBPATH += /home/myuser/instantclient_12_1

//////oci.pro

,然後qmake -o Makefile oci.pro重新生成Makefile檔案,make&&make install實作編譯安裝),在工程檔案裡引用QTPLUGIN += qsqloci

3)同樣,想使用mysql庫,需要安裝mysql-devel,然後去qt-oci插件源代碼目錄(src/plugins/sqldrivers/mysql,修改其*.pro,加入mysql頭及庫路徑[類似oci],然後qmake -o Makefile mysql.pro重新生成Makefile,make&&make install再編譯),在工程檔案裡引用QTPLUGIN += qsqlmysql

4)插件庫的靜态編譯其實就是利用已經靜态編譯好的QT重新編譯其插件工程,可以把插件庫或其他還是動态庫的工程看做你的qt項目編輯,缺啥依賴庫就自行補充好了

附錄:

-prefix 路徑名 編譯後的安裝路徑

-debug-and-release 編譯Debug和Release版本

-static 編譯靜态庫,如果不指定,預設為編譯成DLL

-opensource 使用LGPL協定,如果不指定也行,configure運作後會問的

-no-qt3support 不用編譯與QT3相容的一些廢棄函數,如果你比較熟悉QT3,還是去掉它吧

-no-dbus 不用連結到DBus庫,這個庫偶在Linux裡,Windows裡不用。

-no-phonon 同上,不要連結

-no-webkit 是否編譯Web相關的一些QT子庫,加上這個可以省不少編譯時間,就看你是否準備用這些庫了。

-qt-gif 使用QT自帶的gif庫

-qt-zlib 使用QT自帶的zlib庫

-qt-libpng 使用QT自帶的libpng庫

-qt-libmng 使用QT自帶的libmng庫

-qt-libtiff 使用QT自帶的libtiff庫

-qt-libjpeg 使用QT自帶的libjpeg庫