作者:王姍姍,華清遠(yuǎn)見嵌入式學(xué)院講師。
從題而看,我們必須要明確的是qmake不僅僅是可以在QT中可以使用,在其他的情況下也可以使用。實(shí)際上qmake是一個幫助在不同平臺上簡化編譯步驟的工具,她是來自Trolltech,qmake能夠自動生成Makefile 使得只需要少量的信息就可以創(chuàng)建相應(yīng)的Makefile,qmake能用于很多的軟件工程,不管該軟件工程是否是用qt寫的。
qmake能生成Makefile主要是以工程文件里面的信息為基礎(chǔ).工程文件是開發(fā)者創(chuàng)建的,通常是很簡單的.但是一些復(fù)雜的工程需要創(chuàng)建復(fù)雜的工程文件文件,qmake包含別的特性來支持qt開發(fā).自動的包含uic和moc的編譯規(guī)則.qmake也可以生成Microsoft Visual studio的工程文件而不要求開發(fā)者改變qt的工程文件。
Pro文件
首先我們看下面的例子:
1) CONFIG += qt debug
2)HEADERS += hello.h
3)SOURCES += hello.cpp
4)SOURCES += main.cpp
5)win32 {
SOURCES += hellowin.cpp
}
6)unix {
SOURCES += hellounix.cpp
}
7)!exists( main.cpp ) {
error( “No main.cpp file found” )
1) 首先將源文件添加到工程文件,可以使用SOURCES 變量來做這件事情;
2) 接下來添加頭文件,用同樣的方法添加,不同的是變量名是HEADERS
3) 這是一個qt的程序,我們想把qt加入到CONFIG變量里面 以便qmake能夠添加相關(guān)需要鏈接的qt的庫和確保moc和uic能包含到將要生成的Makefile里面,所以設(shè)置 CONFIG 變量
4) 一個Release版本的程序沒有包含任何調(diào)試符合或者其他的調(diào)試信息,在開發(fā)過程中,給程序提供調(diào)試版本的的相關(guān)信息是十分有用的.所以可以在工程文件里面的CONFIG加上debug就做到了。
5) 當(dāng)你編碼了一段時間后,你的程序可能要做一些平臺相關(guān)的東西,并且決定保持平臺相關(guān)的代碼獨(dú)立性.因此你要做成2個新的文件來包含到你的pro文件, hellowin.cpp and hellounix.cpp 我們不能都把這2個文件添加到SOURCES變量中,因?yàn)閷贛akefile文件里面包含這2個文件.所以,我們要做的就是使用一個域的東西來使得qmake能處理這樣的平臺相關(guān)的問題.加上第5句,如果是在Windows下運(yùn)行qmake,就把hellowin.cpp添加到源文件鏈表里面,如果在別的平臺運(yùn)行qmake,就會忽略它。
6) 加上第六句,創(chuàng)建一個unix平臺相關(guān)的域
7) 如果某寫特定的文件不存在,你可能想不要創(chuàng)建Makefile了,我們可以通過使用exists()函數(shù)檢查一個文件是否存在,我們使用error()函數(shù)可以停止qmake 的處理進(jìn)程.這些都是域的做法一樣.只不過用函數(shù)簡單的替代域.例子中加上了一個檢查main.cpp文件。上面我們分析的是一個pro文件它是用來編譯應(yīng)用程序的,其實(shí)它還可以用來編譯庫以及插件。有時我們還需要修改下pro文件來編譯我們的程序,下面給出幾個例子:
聲明Qt庫模塊
如果CONFIG變量包含了 qt 這個值,表明qmake支持了qt的程序,但是還需要調(diào)整一些你程序中使用的qt 的模塊.這是使用QT變量,就能達(dá)到這個目的。QT是用來聲明使用到的一些額外的模塊.例如.通過下面的方法,我們使得XML和網(wǎng)絡(luò)模塊有效
CONFIG += qt
QT += network xml
注意,默認(rèn)情況下 QT 包含了 core 和 gui模塊了所以上面的聲明是添加了XML和網(wǎng)絡(luò)模塊到默認(rèn)的列表里面.下面的語句就是忽略了默認(rèn)模塊,當(dāng)編譯程序源代碼時候會導(dǎo)致出錯
QT = network xml # This will omit the core and gui modules.
如果你想編譯一個不需要gui模塊的工程,你需要用”-=”操作符號來去除包含,默認(rèn)情況下,QT同時包含了core和gui兩個模塊,所以下面的語句就是小型的Qt工程會被編譯
QT -= gui # Only the core module is used.
下面的表格顯示了QT變量可以使用的選項,并解釋了相應(yīng)的特點(diǎn)
core (included by default)
QtCore module 核心模塊
gui (included by default)
QtGui module 界面模塊
network
QtNetwork module 支持網(wǎng)絡(luò)模塊
opengl
QtOpenGL module 支持opengl圖像編程
sql
QtSql module 支持sql數(shù)據(jù)庫驅(qū)動
svg
QtSvg module 支持svg矢量圖形
xml
QtXml module 支持xml模塊
qt3support
Qt3Support module 支持qt3類
要注意的是,添加opengl到QT變量里面 ,等價于往CONFIG變量里面添加,所以對qt應(yīng)用程序,沒有必要同時往QT變量和CONFIG變量里面添加opengl選項
聲明Qt庫模塊
qmake可以通過專門的prf文件設(shè)置另外的配置特性.這些特性通常提供給編譯時候的自定義的工具使用.為了在處理過程添加一個特性,往CONFIG變量里面添加一個特性名字,該名字跟特性的文件名相同(mkspecsfeatures目錄里面)
例如 qmake可以在編譯過程利用pkg-config 提供支持的額外的庫,例如D-Bus庫 和 ogg庫,用下面的方法
CONFIG += link_pkgconfig
PKGCONFIG += ogg dbus-1
聲明其他的庫
如果你需要在工程中使用其他的庫,你需要在工程文件里面指定
讓qmake 找到庫的路徑和相應(yīng)需要連接的庫,可以在LIBS變量里面添加.庫的路徑要給出,或者常見的unix樣式的符號來指定庫和庫的路徑
例如下面的展示了如何使用指定的庫
LIBS += -L/usr/local/lib -lmath
可以用類似的方法來指定頭文件的路徑,不過是使用INCLUDEPATH變量,如下面可能添加好幾個頭文件的路徑
INCLUDEPATH = c:/msdev/include d:/stl/include
不過我的習(xí)慣是下面這樣的,比較清晰還有,最好windows的路徑不要有空格,中文也不要有,斜杠也推薦用/ 而不是windows的 因?yàn)楦中蟹栂嗤?/可以在unix和windows用,但是貌似到了unix或linux就不行了,所以用/ 是通用的
INCLUDEPATH = c:/msdev/include
d:/stl/include
運(yùn)行qmake
當(dāng)在命令行里面運(yùn)行qmake時候,可以指定變量選項來定制qmake的行為,這樣使得編譯過程更協(xié)調(diào),提供更有用的診斷信息,并能夠使你的工程用于指定的目標(biāo)平臺。
語法
用來運(yùn)行qmake的語法如下
qmake [mode] [options] files
qmake支持兩種不同模式的操作,默認(rèn)情況下qmake將會使用project中的配置來生成Makefile文件,但是也可以用qmake生成pro文件.如果你想明確的設(shè)置選項,你必須在所有其他的選項前指定,模式可以是下面的其中之一的值
·makefile qmake將輸出一個Makefile文件。
·project qmake將輸出一個pro文件。
下面的選項用來同時指定生成和特殊模式設(shè)置。文件參數(shù)是列出了一個或者多個工程文件(pro文件) 用空格分開
選項
在命令行里面,為qmake指定一些選項是為了自定義編譯的過程。并覆蓋平臺的為qmake做的默認(rèn)設(shè)置,下面的基本的選項提供了用法信息,指定qmake寫到輸出文件的那里,控制調(diào)試信息的等級在控制臺打印出來。
·help 列出qmake幫助信息
·o file 直接輸出到文件file。如果這個選項沒有指定, qmake將會嘗試使用合適的文件名作為輸出,這依賴于當(dāng)前的運(yùn)行模式。如果指定了‘-’, 輸出將會直接在控制臺打印出來。
·d 列出qmake的調(diào)試信息 由于工程需要在每個目標(biāo)平臺上進(jìn)行不同的編譯,并有很多子目錄, 你可以在運(yùn)行qmake的時候使用下面的選項來設(shè)置相應(yīng)的指定平臺的變量:
·unix qmake運(yùn)行在unix模式。在這個模式下,將會使用unix風(fēng)格的文件命名規(guī)則和路徑轉(zhuǎn)換 , 另外的測試unix域是成功的。這是unix平臺的默認(rèn)模式。
·macx qmake運(yùn)行在Mac OS X模式。在這個模式下,將會使用unix風(fēng)格的文件命名規(guī)則和路徑轉(zhuǎn)換 , 另外的測試macx域是成功的。這是Mac OS X平臺的默認(rèn)模式。
·win32 qmake運(yùn)行在win32模式。在這個模式下,將會使用Windows風(fēng)格的文件命名規(guī)則和路徑轉(zhuǎn)換 , 另外的測試win32域是成功的。這是Windows平臺的默認(rèn)模式。 工程的模板通常在pro文件的TEMPLATE 變量里面指定。我們可以使用下面的選項來重寫或者覆蓋:
·t tmpl qmake將會用tmpl來重寫TEMPLATE變量的任何設(shè)置, 但只在pro文件被處理之后。
·tp prefix qmake將添加prefix到TEMPLATE變量里面。
調(diào)整警告信息的級別能夠幫助你找到pro文件的問題所在:
·Wall qmake將會報告所有知道的警告信息。
·Wnone qmake不產(chǎn)生任何警告信息。
·Wparserqmake只產(chǎn)生詞法分析的警告。在解析你的pro文件的時候會警告你一些普通的缺陷和潛在問題。
·Wlogic qmake警告你在pro文件存在一些普通
Makefile 模式選項
qmake -makefile [options] files
在 Makefile 模式, qmake將會生成用于編譯工程的Makefile文件,另外下面的選項可能在本模式下使用,以影響工程文件的生成方式:
·after qmake將會在指定的文件后面處理一些命令行給出的任務(wù)
·nocache qmake將忽略。qmake.cache 文件。
·nodepend qmake將不產(chǎn)生任何依賴信息。
·cache file qmake將使用指定的緩沖文件file而忽略其他找到的.qmake.cache 文件。
·spec spec qmake將會使用spec作為平臺的路徑和編譯器信息, 環(huán)境變量 QMAKESPEC 設(shè)置的值將會被忽略。
你也可以在命令行傳遞qmake參數(shù);他們將會在所有的指定的文件之前處理:
qmake -makefile -unix -o Makefile “CONFIG+=test” test.pro
上面的意思就是,在unix模式下,使用test.pro
加入test選項生成Makefile,但是一些指定的選項當(dāng)他們是默認(rèn)的情況是沒有必要的添加的,因此,如果在unix上 就是下面的
qmake “CONFIG+=test” test.pro
如果你確定你自己想在指定的文件后面處理一些變量,你可以傳遞-after選項。當(dāng)這個被指定時,命令行所有的任務(wù)在–after選項之后會被延遲,直到指定的文件傳進(jìn)來了。
Project Mode Options
qmake -project [options] files
在工程模式,qmake將會生成pro文件。另外,你可以在本模式下添加下面的選項:
·r qmake將會遍歷目錄
·nopwd qmake將會不理會你當(dāng)前工作目錄的源代碼文件而去使用指定的文件
在這個模式.files變量可以是文件或者目錄的列表 如果指定一個目錄,將會包含進(jìn)DEPENDPATH變量里面 目錄里面相關(guān)的代碼會被包含進(jìn)生成的工程文件里面。 如果給的是文件, 將會添加到正確的變量, 這主要依賴于他們的擴(kuò)展名(后綴名); 例如, .ui 文件會被添加到 FORMS(qt2是INTERFACES吧), .cpp 文件會被添加到 SOURCES。
在這個模式下。你也可以傳遞任務(wù)到命令行里面, 當(dāng)這樣做的時候,這些任務(wù)將會放到生成pro文件之后。
“本文由華清遠(yuǎn)見http://www.embedu.org/index.htm提供”
來源:華清遠(yuǎn)見2次