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]

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