Qt的目錄依賴問題----怎樣生成一個綠色的Qt軟件包
一、核心問題:
如果將編譯好的Qt文件拷貝到任何目錄下,作為一個綠色軟件庫來使用?
二、原理討論
由於Qt在編譯的時候將安裝路徑硬編碼到了庫文件中,這個問題似乎不太好解決。使用如下命令,可以查看到底有哪些路徑:
qmake -query
可得到類似的如下結果:
QT_INSTALL_PREFIX:/usr/lib/qt4 QT_INSTALL_DATA:/usr/lib/qt4 QT_INSTALL_DOCS:/usr/share/doc/qt4 QT_INSTALL_HEADERS:/usr/include QT_INSTALL_LIBS:/usr/lib QT_INSTALL_BINS:/usr/lib/qt4/bin QT_INSTALL_PLUGINS:/usr/lib/qt4/plugins QT_INSTALL_IMPORTS:/usr/lib/qt4/imports QT_INSTALL_TRANSLATIONS:/usr/share/qt4/translations QT_INSTALL_CONFIGURATION:/etc QT_INSTALL_EXAMPLES:/usr/lib/qt4/examples QT_INSTALL_DEMOS:/usr/lib/qt4/demos QMAKE_MKSPECS:/usr/lib/qt4/mkspecs QMAKE_VERSION:2.01a QT_VERSION:4.7.4
幸運的是,在Qt4中引入了一個新的機制: qt.conf,於是,這個問題得以解決。這些路徑都可以被覆蓋。在assistant中查看qt.conf的幫助,可以了解qt.conf的大致寫法。
[Paths] Prefix = /some/path Translations = i18n
如果你將上述qt.conf置於qmake所在的目錄下會發生什么? qmake -query會告訴你答案
QT_INSTALL_PREFIX:/some/path QT_INSTALL_DATA:/some/path QT_INSTALL_DOCS:/some/path/doc QT_INSTALL_HEADERS:/some/path/include QT_INSTALL_LIBS:/some/path/lib QT_INSTALL_BINS:/some/path/bin QT_INSTALL_PLUGINS:/some/path/plugins QT_INSTALL_IMPORTS:/some/path/imports QT_INSTALL_TRANSLATIONS:/some/path/i18n QT_INSTALL_CONFIGURATION:/some/path QT_INSTALL_EXAMPLES:/some/path QT_INSTALL_DEMOS:/some/path QMAKE_MKSPECS:/some/path/mkspecs QMAKE_VERSION:2.01a QT_VERSION:4.8.2
於是,我們可以得到如下結論: 假如有一個qt.conf文件位於Qt可執行文件所有的目錄下面,比如/usr/bin目錄中,則這些可執行文件的搜索路徑將被qt.conf中指定的路徑所覆蓋。 Prefix是關鍵,它指定了Qt的根目錄,其它很多路徑根據這個路徑來指定 有一些路徑會有一個默認值,比如lib,bin, 還有一些則沒有,比如examples, demos
三、解決方案
鑒於此,下面給出一個可供參考的qt.conf模板
[Paths] Prefix = /media/Disk/qt-everywhere-opensource-src-4.8.2 Translations = translations Plugins = plugins Imports = imports Examples = examples Demos = demos
剩下的問題是,每換一個地方,就要手動改一次,重復勞動實在有些不爽。下面提供兩個分別針對Windows和Linux的腳本,編譯完Qt之后,刪掉最大的src目錄,然后將此腳本置於根目錄下即可。
Windows版本: updateQt.bat
:: :: this file should be placed in Qt root directory :: eg. if qmake.exe is in C:\Qt\bin, :: this script should be in C:\Qt :: :: Reference:http://www.cuteqt.com/blog/?p=149 :: Reference:http://blog.csdn.net/jq0123/article/details/4325256 REM get current directory REM and replace \ with / SET PWD=%~dp0 SET CONF=%PWD%\bin\qt.conf SET PWD=%PWD:\=/% echo [Paths] >%CONF% echo Prefix = %PWD% >>%CONF% echo Translations = translations >>%CONF% echo Examples = examples >>%CONF% echo Demos = demos >>%CONF%
Linux版本: updateQt.sh
#!/bin/bash function ScriptAbsolutePath() { DIR=$(dirname `which $0`) echo $DIR } Prefix=`ScriptAbsolutePath` Translations=translations Plugins=plugins Imports=imports Examples=examples Demos=demos CONF=$Prefix/bin/qt.conf echo [Paths] >$CONF echo Prefix = $Prefix >>$CONF echo Translations = $Translations >>$CONF echo Plugins = $Plugins >>$CONF echo Imports = $Imports >>$CONF echo Examples = $Examples >>$CONF echo Demos = $Demos >>$CONF
四、總結
假如你編譯了一個Qt庫,那么你可以實施如下步驟:
- 刪除src目錄,里面都是一些源碼和臨時文件。你還可以刪除其它一些無關的目錄,但都不大,無傷大雅。
- 在根目錄下編寫腳本updateQt.bat或updateQt.sh,內容如下。
- 每次將整個目錄拷到其它地方時,執行一下腳本。
- 將Qt的bin目錄加到系統路徑中去。這樣,別的軟件就能找到qmake,然后,它就能自動找到庫文件(lib)和頭文件(include)的位置。
然后,你就得到了一個近似於綠色的Qt發行版。每換一次地方只需要執行一下腳本哦。
注意:只針對Qt4,Qt3沒這個機制。
http://www.ituring.com.cn/article/5485