Qt的目錄依賴問題----怎樣生成一個綠色的Qt軟體包

Martin Wang發表於2012-07-09

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沒這個機制。

相關文章