C++ GUI Programming with Qt4 Second Edition 之 B.2 使用第三方編譯工具

B.2 使用第三方編譯工具

      很多開源或商業的編譯工具都可以用來編譯Qt應用程序。這些工具主要分成兩大類:一類生成makefile文件(或IDE工程文件),工程編譯依賴於標準的編譯系統;另一類無需外部編譯工具,其本身就是一套編譯系統。

      本節,我們將學習三種工具,它們對Qt提供內置支持,獲取方便,使用簡單。其中一個是CMake,用於生成makefile文件;另外兩個是Boost.Build和SCons,它們都是獨立的編譯系統。我們將分別演示使用這三個工具編譯第三章和第四章開發的Spreadsheet軟件的過程方法。雖然評估任何新的編譯工具或編譯系統都需要詳細的研讀以及實際軟件的開發試驗,但我們仍希望本章簡短的介紹能夠爲各位選擇工具提供參考。

CMake:跨平臺的編譯工具

      CMake工具是一款開源跨平臺的makefile生成工具,內置支持Qt 4開發,可以在網站http://www.cmake.org/下載。要使用CMake,必須新建一個用於描述工程的CMakeLists.txt文件,它比較像qmake的.pro文件,下面是Spreadsheet程序的CMakeLists.txt文件:

project(spreadsheet) 
cmake_minimum_required(VERSION 2.4.0) 
find_package(Qt4 REQUIRED) 
include(${QT_USE_FILE}) 
set(spreadsheet_SRCS 
    cell.cpp 
    finddialog.cpp 
    gotocelldialog.cpp 
    main.cpp 
    mainwindow.cpp 
    sortdialog.cpp 
    spreadsheet.cpp 
) 
set(spreadsheet_MOC_SRCS 
    finddialog.h 
    gotocelldialog.h 
    mainwindow.h 
    sortdialog.h
    spreadsheet.h 
) 
set(spreadsheet_UIS
    gotocelldialog.ui 
    sortdialog.ui 
) 
set(spreadsheet_RCCS 
    spreadsheet.qrc 
) 
qt4_wrap_cpp(spreadsheet_MOCS ${spreadsheet_MOC_SRCS}) 
qt4_wrap_ui(spreadsheet_UIS_H ${spreadsheet_UIS}) 
qt4_wrap_cpp(spreadsheet_MOC_UI ${spreadsheet_UIS_H}) 
qt4_add_resources(spreadsheet_RCC_SRCS ${spreadsheet_RCCS}) 
add_definitions(-DQT_NO_DEBUG) 
add_executable(spreadsheet 
    ${spreadsheet_SRCS} 
    ${spreadsheet_MOCS} 
    ${spreadsheet_MOC_UI} 
    ${spreadsheet_RCC_SRCS}) 
target_link_libraries(spreadsheet ${QT_LIBRARIES} pthread)

      文件中大部分內容都是簡單的固定模板。必須根據工程實際設置的內容有:應用程序名稱(第一行);.cpp源文件列表;.ui文件列表;.qrc文件列表。CMake可以自動搜索.h頭文件並識別相互之間的依賴關係,無需人爲指定。但是,要使用moc處理的定義Q_OBJECT類的頭文件,必須列舉出來。

      文件前面幾行設置應用程序名稱,並引入CMake對Qt 4的支持。之後,建立幾個變量保存文件名。qt4_wrap_cpp()命令在給定的文件上運行moc,類似地,qt4_wrap_ui()運行uic、qt4_add_resources()運行rcc。要創建可執行文件,需要指定所有用到的.cpp文件,包括moc和rcc生成的那些。最後,必須指定可執行文件鏈接的函數庫,本例中鏈接了標準的Qt 4函數庫和線程庫。

      完成CMakeLists.txt文件後,使用如下命令生成makefile文件:

      cmake

      本命令調用CMake讀取當前文件夾下的CMakeLists.txt文件並生成名爲Makefile的文件。之後,可以用make(或nmake)編譯應用程序。如果要重新編譯,先用make clean清除編譯結果。

Boost.Build(bjam)

      Boost C++類庫自帶編譯工具,即Boost.Build,也叫bjam,可在網站http://www.boost.org/tools/build/v2/免費獲取安裝包及其幫助文檔。第2版的Boost.Build內置支持編譯Qt4應用程序,但需要增加QTDIR環境變量指定Qt 4的安裝路徑。部分Boost.Build安裝包默認禁止了對Qt的支持,這種情況下,必須在user-config.jam文件中增加一行:

      using qt ;

      Qt的安裝路徑除了使用QTDIR指定外,也可以通過修改上面一行來指定,如下:

      using qt : /home/kathy/opt/qt432 ;

      Boost.Build編譯應用程序需要兩個文件:boost-build.jam和Jamroot。實際上,如果某文件夾下包含多個應用程序(程序文件夾可以是該文件夾的多層嵌套的子文件夾,且對嵌套層數無限制),那這些應用程序可以共用boost-build.jam的一個副本,將這個副本放在該文件夾下即可。boost-build.jam文件只包含一行指定編譯系統安裝路徑的代碼,比如:

      boost-build /home/kathy/opt/boost-build ;

      用於編譯Spreadsheet程序的Jamroot文件如下:

using qt : /home/kathy/opt/qt432 ; 
 
exe spreadsheet : 
    cell.cpp 
    finddialog.cpp 
    finddialog.h 
    gotocelldialog.cpp 
    gotocelldialog.h 
    gotocelldialog.ui 
    main.cpp 
    mainwindow.cpp 
    mainwindow.h 
    sortdialog.cpp 
    sortdialog.h 
    sortdialog.ui 
    spreadsheet.cpp 
    spreadsheet.h 
    spreadsheet.qrc 
    /qt//QtGui
    /qt//QtCore ;

      第一行引入了對Qt 4的支持,且必須提供Qt 4的安裝路徑(在未設置QTDIR環境變量的情況下)。之後,指定要生成的可執行文件名稱spreadsheet及其用到的文件列表。一般情況下,Boost.Build可以自動搜索.h頭文件並識別相互之間的依賴關係,無需人爲列舉。但是,要使用moc處理的定義Q_OBJECT類的頭文件,必須列舉出來。最後兩行指定了要用到的Qt庫。

      假設當前路徑包含bjam可執行文件,我們可以使用如下命令編譯應用程序:

      bjam release

      本命令行調用Boost.Build以發佈模式編譯當前文件夾下Jamroot文件指定的應用程序(如果只安裝了Qt的調試庫,發佈模式的編譯過程會報錯,這種情況下,要運行bjam debug)。在必要的時候,也可以運行moc、uic、rcc工具。運行bjam clean release可以清除編譯結果。

SCons:軟件構建工具

      SCons工具是一款基於Python的開源編譯工具,可以用來取代make工具,可在網站http://www.scons.org/獲取。它內置支持Qt 3,還有一個支持Qt 4的擴展組件。擴展組件由David García Garzón提供,可在網站http://www.iua.upf.edu/~dgarcia/Codders/sconstools.html獲取。在該網站下載qt4.py文件,並與應用程序放在同一文件夾下。希望官方的SCons發佈版本能儘快包含這個擴展件。

      qt4.py存放好後,我們可以創建SConstruct文件,該文件用於配置編譯過程,代碼如下:

#!/usr/bin/env python 
 
import os 
 
QT4_PY_PATH = "." 
QTDIR = "/home/kathy/opt/qt432" 
 
pkgpath = os.environ.get("PKG_CONFIG_PATH", "") 
pkgpath += ":%s/lib/pkgconfig" % QTDIR 
os.environ["PKG_CONFIG_PATH"] = pkgpath 
os.environ["QTDIR"] = QTDIR 
 
env = Environment(tools=["default", "qt4"], toolpath=[QT4_PY_PATH]) 
env["CXXFILESUFFIX"] = ".cpp"
env.EnableQt4Modules(["QtGui", "QtCore"]) 
rccs = [env.Qrc("spreadsheet.qrc", QT4_QRCFLAGS="-name spreadsheet")] 
uis = [env.Uic4(ui) for ui in ["gotocelldialog.ui", "sortdialog.ui"]] 
sources = [ 
    "cell.cpp", 
    "finddialog.cpp", 
    "gotocelldialog.cpp", 
    "main.cpp", 
    "mainwindow.cpp", 
    "sortdialog.cpp", 
    "spreadsheet.cpp"] 
env.Program(target="spreadsheet", source=[rccs, sources])

      本文件是用Python編寫的,因此我們可以使用Python語言提供的所有功能和函數庫。

      文件的大部分內容都是固定模版,只有少數需要根據應用程序設置的條目。首先設置qt4.py的存放路徑和Qt 4的安裝路徑。爲了避免在每個應用程序文件夾下拷貝qt4.py,可以將其存放在一個固定路徑下並相應地在SConstruct設置其路徑。我們必須顯式地使能用到的Qt模塊,如本例中的QtCore和QtGui,也要指定需要由rcc和uic處理的文件。最後,列舉源文件,設置程序名稱並將其與用到的源文件和資源文件關聯起來。無需指定.h頭文件,Qt 4的支持插件可以自動檢查.cpp文件並在必要時正確調用moc。

      現在,可以使用scons命令編譯應用程序了:

      scons

      本命令編譯當前文件夾下由SConstruct文件指定的應用程序。使用scons -c可以清除編譯結果。


微信公衆號:Qt開發社區(期待您的關注,掃下方二維碼或搜索“Qt開發社區”或"Qtkfsq")

投 稿 郵 箱 :[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章