qt4.6 Linux
./configure -static -release -confirm-license -opensource -qt-zlib -qt-libpng -qt-libjpeg -nomake examples -nomake demos -nomake doc -prefix /opt/qt4_static php
qt5.6 linux
./configure -static -release -confirm-license -opensource -no-xcb -qt-zlib -qt-libpng -qt-libjpeg -nomake examples -qt-sql-sqlite -prefix /opt/qt5_static html
ubuntu14
apt-get install libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-glx0-dev libxcb-xinerama0-dev
./configure -static -release -confirm-license -opensource -qt-xcb -qt-zlib -qt-libpng -qt-libjpeg -nomake examples -qt-sql-sqlite -prefix /opt/qt5_static linux
http://blog.csdn.net/earbao/article/details/53860574sql
------------------------------------------------------------------------------------------------------------ubuntu
Qt下靜態編譯Qt,根據個人經驗,若是按照Windows下那種直接拿官方sdk安裝以後的文件來編譯是行不通的,須要直接下載Qt的source包,目前諾基亞的源碼叫作qt-everywhere-opensource-src的tar包,到網上一查,乖乖,大部分人編譯這個包竟然花費了12~13個小時!可是,根據我在Windows下靜態編譯Qt的經驗,其實這之中不少東西都是能夠不用編譯的,最終我大約用了40分鐘編譯完成了所有內容。若是你直接使用官方的sdk安裝,那麼你就已經有了一個動態庫,如今你又經過源碼包編譯,那麼只要編譯出靜態庫,由於你已經有動態庫,你甚至只須要編譯靜態release庫就足夠了,誰會在平時編譯的時候就要用那種浪費時間的靜態編譯?等到產品要部署到別的機器的時候,Qt須要用的時候鏈接上就能夠了,這樣其它的內容,如動態庫的demo,examples都依舊可用,安裝兩個版本又不會花太多時間,豈不一箭雙鵰?長話短說,如今說安裝步驟。多線程
1. 到網上下載qt-everywhere源碼包,app
若是你只要庫,那麼你也能夠到下面的網址找到你須要的版本。工具
http://www.linuxidc.net/thread-2237-1-1.htmlui
2. 解壓縮到你的目標目錄spa
3. 經過configure選擇要編譯的部分。
你能夠經過直接修改configure文件中的QT_DEFAULT_BUILD_PARTS="libs tools examples demos docs translations",把examples,docs,demos都去掉(我只去掉了這三個,理論上若是安裝了動態版本,tools和translations(這個是linguist要用的)也是能夠去掉的。你也能夠經過在最終的configure指令中加入 –no-make ***(這裏就是剛纔提到的PARTS名字),而無需修改configure文件
還有一些選項是默認的,你也能夠指定選項。這些默認選項在大部分狀況下都是沒問題的,但是若是你的程序要部署到某些不肯定的linux系統上,譬若有的系統連jpg,png的庫都沒有(這些在configure默認選項中使用的是系統庫,若是系統沒有這些庫,豈不悲劇),那麼你能夠加入 –qt-gif -qt-libpng –qt-libmng –qt-libjpeg幾個選項。
若是你決定只用靜態庫來作最終產品發佈,那麼你沒有必要編譯debug庫,只須要編譯release便可。
4. 使用configure生成makefile
由於你不但想用本身編譯的靜態庫,你還想可以用sdk自動安裝的動態庫以及那些demos,examples,爲了能讓兩個Qt庫共存,configure時必須爲靜態庫制定一個與動態庫所在位置不一樣的文件夾,例如個人sdk安裝到 /opt/qtsdk-2010.05/下,那麼我就在/opt下創建了一個叫qtstatic的文件夾來存放靜態庫,而後使用的configure命令:
./configure –prefix /opt/qtstatic –static –release。固然,我不喜歡看到滿屏亂七八糟的輸出,以及由於一個小錯誤忽然終止了編譯,因此又指定了如下選項:
-continue 當發生錯誤時,儘量繼續編譯
-silent 進行make時只會顯示警告和錯誤等,不會把編譯指令也輸出到屏幕上
固然,若是你最初沒有經過修改configure文件的方式來刪減編譯模塊,不要忘記加上-nomake選項,譬如你不想編譯examples,就能夠加上:
-nomake examples ,依次類推
由於工程比較大,因此這個步驟可能會花費幾分鐘的時間。若是你指定編譯的內容不是不少,應該能夠很快完成。
5. 編譯和安裝
最後固然就是make和make install了,不過不要忘了make還有多線程編譯的功能喲!若是你的機器這段時間不打算作別的事情的話,徹底能夠加入如下選項:
-k 當發生錯誤時,儘量繼續編譯
-j N 同時進行N項編譯,建議N的值爲你的CPU核數X1.5。固然,我選的值略微狠了點,個人電腦是奔騰雙核T4300,make指令爲: make –k –j 4 ,而後我就看到系統監視器裏CPU直接飆到100%了。
編譯完成,make install就能夠。固然,做爲linux系統,須要注意文件夾的權限問題……呃,若是你不瞭解這個問題,我想你須要在linux上多下點兒功夫
6. 如何靜態編譯一個程序
在pro文件中,加入
CONFIG +=static或者
CONFIG +=staticlib,這個具體取決於你的工程類型了。
這樣Qt就會讓編譯器儘可能尋找靜態庫來鏈接(包括Qt庫以外的那些庫),固然,這不排除Qt會靜態鏈接一些會致使兼容性問題的庫。這個在Qt Centre中有人提出了一個解法,若有須要能夠查閱:
http://www.qtcentre.org/wiki/index.php?title=Building_static_applications
7. 動態/靜態兩個版本共存問題
一般,你是不須要在系統變量中加入Qt庫的位置的。Qt Creator能夠自動掃描到系統中存在的Qt庫版本,若是掃描不到,你能夠經過Creator的 Tool->Options->Qt4中添加靜態庫的路徑。而QDevelop雖然沒有那麼智能,你也能夠手動指定INCLUDE和LIB的位置。或許,這根本就不是一個問題。若是你懷念動態庫,或者在產品發佈以前並不想體驗靜態編譯那種蝸牛爬通常的速度,你能夠在pro文件中指定CONFIG += shared,並且,要記得在Project中選擇相應的版本。
8. 靜態版本過大的問題
首先,靜態編譯的Qt程序一個debug版程序150M左右,一個release版本10M左右,這樣你知道爲何我不會編譯靜態debug庫了吧?由於沒有必要。你可使用strip,UPX(Windows)等工具來壓縮你生成的龐大程序。空間與速度歷來都是一對冤家,Windows下靜態編譯出的程序,通過UPX壓縮能夠減小到原來的通常體積,可是啓動速度也隨之嚴重降低。固然,論程序啓動速度,本身的設計和實現纔是關鍵所在,最後發佈的程序要不要壓縮,那須要根據實際狀況而定。
祝你與Qt相處愉快!
PS. configure階段出現 「Basic XLib functionality test failed「的解決辦法:
編譯qt-x11-opensource-src-4.5.3是出現「Basic XLib functionality test failed「
解決方法:
此完整出錯信息是在./configure階段
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 in /home/zhu/Qt/qt-x11-opensource-src-4.5.2/mkspecs/linux-g++
進config.test/x11/xlib 執行make命令,看出錯信息
g++ -Wl,-O1 -o xlib xlib.o -L/usr/X11R6/lib -lXext -lX11 -lm
/usr/bin/ld: cannot find -lXext
能夠看到,g++在/usr/X11R6/lib下,找不到libXext.so
其緣由就在於須要安裝libX11的開發包,根據本身的系統特色,安裝 libX11-dev libXext-dev libXtst-dev
對於Ubuntu,直接 sudo apt-get install libx11-dev libxext-dev libxtst-dev
問題解決!
參考:http://www.linuxidc.com/Linux/2011-05/36303.htm