QT中的qmake詳解


關於qmake,好一段時間令我一頭霧水,不知道用來干嘛的,只知道怎么用,而且也只懂那么一兩個命令,詳細看過資料以后整理如下:

1.首先,感性的認識是,qmake可以利用源文件(包括頭文件h,實現文件cpp,qt的ui文件等等)生成各種不同類型的工程,工程需要的Makefile文件,可執行的與不可執行的,這取決於所用的模板(包括app、lib、subdirs、vcapp、vclib)。

2.創建pro文件,添加各種源文件,還可以設定平台相關的不同源文件,設置各種規則,利用qmake命令生成工程。后面會介紹pro文件可以手工編寫,也可以利用qmake命令智能的生成。

一般順序是先創建.pro文件,然后由.pro文件生成Makefile文件,makefile文件保存了編譯器和連接器的參數選項,還表述了所有源文件之間的關系(源代碼文件需要的特定的包含文件,可執行文件要求包含的目標文件模 塊及庫等).創建程序(make程序)首先讀取makefile文件,然后再激活編譯器,匯編器,資源編譯器和連接器以便產生最后的輸出,最后輸出並生成 的通常是可執行文件.創建程序利用內置的推理規則來激活編譯器,以便通過對特定cpp文件的編譯來產生特定的obj文件。

3.各種模板生成不同類型的工程,而每個模板可以用的qmake變量是不一樣的:

app模板:編譯一個可執行程序

選項        描述

windows     程序是Window平台的界面程序

console     App模板專用: 程序是Window平台控制台程序

當你使用這個模板,以下的一些qmake變量是能用的,你可以在pro文件使用這些變量來配置你的應用程序需要的相關的信息

HEADERS –程序中需要編譯的頭文件列表.

SOURCES -程序中需要編譯的源文件列表.

FORMS – 由Qt Designer為程序創建的ui文件列表(qte2是INTERFACES).

LEXSOURCES – 程序用到的所有的lex 源文件列表.

YACCSOURCES -程序用到的所有的yacc 源文件列表.

TARGET –可執行程序的名字.默認是跟工程文件名一樣 (根據不同的平台后綴名會自動添加).

DESTDIR –可執行文件的發布目錄.

DEFINES – 程序編譯時候需要的預定義的列表INCLUDEPATH –程序需要的頭文件的目錄列表.

DEPENDPATH –程序搜索的依賴路徑.

VPATH – 查找supplied 文件的搜索路徑(我還沒有弄懂~_~).

DEF_FILE – Windows 平台專用: 程序需要用到的.def .

RC_FILE – Windows 平台專用: 程序的資源文件.

RES_FILE – Windows 平台專用: 程序需要連接的資源文件.

lib模板庫:

lib模板告訴qmake生成的Makefile是將要編譯一個庫,使用這個模板的時候,另外的系統變量會加到上面app模板提到的變量,因為app模板是支持VERSION 變量,你應該在pro文件使用這些來制定一些庫的庫的信息
使用這個模板的時候,下面的選項可以添加到 CONFIG 變量里面來決定編譯成何種庫
選項        描述

dll        編譯成動態庫 (dll or so).

staticlib      編譯成靜態庫.

plugin      編譯成插件庫,本選項意味着dll也設置了.

VERSION – 目標庫的版本號,如 2.3.1

編譯成一個插件
插件的編譯是使用lib模板,正如上面所描述的那樣,這告訴 qmake生成的Makefile是將要編譯成為每個平台都適當的形式的插件.通常是庫的形式,跟普通的庫一樣VERSION 變量是用來指定一些有關插件的信息
VERSION – 目標庫的版本號,如 2.3.1

聲明Qt庫模塊

如果CONFIG變量包含了qt這個值,表明qmake支持了qt的程序,但是還需要調整一些你程序中使用的qt 的模塊.這是使用QT變量,就能達到這個目的。QT是用來聲明使用到的一些額外的模塊.例如.通過下面的方法,我們使得XML和網絡模塊有效

CONFIG += qt

QT += network xml

注意,默認情況下 QT 包含了 core 和 gui模塊了所以上面的聲明是添加了XML和網絡模塊到默認的列表里面.下面的語句就是忽略了默認模塊,當編譯程序源代碼時候會導致出錯

QT = network xml # This will omit the core and gui modules.

如果你想編譯一個不需要gui模塊的工程,你需要用”-=”操作符號來去除包含,默認情況下,QT同時包含了core和gui兩個模塊,所以下面的語句就是小型的Qt工程會被編譯

QT -= gui # Only the core module is used.

下面的表格顯示了QT變量可以使用的選項,並解釋了相應的特點

core (included by default) QtCore module 核心模塊

gui (included by default) QtGui module 界面模塊

network QtNetwork module 支持網絡模塊

opengl QtOpenGL module 支持opengl圖像編程

sql QtSql module 支持sql數據庫驅動

svg QtSvg module 支持svg矢量圖形

xml QtXml module 支持xml模塊

qt3support Qt3Support module 支持qt3類

要注意的是,添加opengl到QT變量里面 ,等價於往CONFIG變量里面添加,所以對qt應用程序,沒有必要同時往QT變量和CONFIG變量里面添加opengl選項

聲明Qt庫模塊

qmake可以通過專門的prf文件設置另外的配置特性.這些特性通常提供給編譯時候的自定義的工具使用.為了在處理過程添加一個特性,往CONFIG變量里面添加一個特性名字,該名字跟特性的文件名相同(mkspecs\features目錄里面)

例如 qmake可以在編譯過程利用pkg-config 提供支持的額外的庫,例如D-Bus庫 和 ogg庫,用下面的方法

CONFIG += link_pkgconfig

PKGCONFIG += ogg dbus-1 
聲明其他的庫

如果你需要在工程中使用其他的庫,你需要在工程文件里面指定,讓qmake找到庫的路徑和相應需要連接的庫,可以在LIBS變量里面添加.庫的路徑要給出,或者常見的unix樣式的符號來指定庫和庫的路徑,例如下面的展示了如何使用指定的庫

LIBS += -L/usr/local/lib -lmath

可以用類似的方法來指定頭文件的路徑,不過是使用INCLUDEPATH變量,如下面可能添加好幾個頭文件的路徑

INCLUDEPATH = c:/msdev/include d:/stl/include

不過我的習慣是下面這樣的,比較清晰還有,最好windows的路徑不要有空格,中文也不要有,斜杠也推薦用/ 而不是windows的\ 因為跟分行符號\相同了 /可以在unix和windows用,但是\貌似到了unix或linux就不行了,所以用/ 是通用的

INCLUDEPATH = c:/msdev/include \

d:/stl/include

選項

在命令行里面,為qmake指定一些選項是為了自定義編譯的過程。並覆蓋平台的為qmake做的默認設置,下面的基本的選項提供了用法信息,指定qmake寫到輸出文件的那里,控制調試信息的等級在控制台打印出來。

·help 列出qmake幫助信息

·o file 直接輸出到文件file。如果這個選項沒有指定, qmake將會嘗試使用合適的文件名作為輸出,這依賴於當前的運行模式。如果指定了‘-’, 輸出將會直接在控制台打印出來。

·d 列出qmake的調試信息 由於工程需要在每個目標平台上進行不同的編譯,並有很多子目錄, 你可以在運行qmake的時候使用下面的選項來設置相應的指定平台的變量。

·unix qmake運行在unix模式。在這個模式下,將會使用unix風格的文件命名規則和路徑轉換 , 另外的測試unix域是成功的。這是unix平台的默認模式。

·macx qmake運行在Mac OS X模式。在這個模式下,將會使用unix風格的文件命名規則和路徑轉換 , 另外的測試macx域是成功的。這是Mac OS X平台的默認模式。

·win32 qmake運行在win32模式。在這個模式下,將會使用Windows風格的文件命名規則和路徑轉換 , 另外的測試win32域是成功的。這是Windows平台的默認模式。 工程的模板通常在pro文件的TEMPLATE 變量里面指定。我們可以使用下面的選項來重寫或者覆蓋:

·t tmpl qmake將會用tmpl來重寫TEMPLATE變量的任何設置, 但只在pro文件被處理之后。

·tp prefix qmake將添加prefix到TEMPLATE變量里面。 調整警告信息的級別能夠幫助你找到pro文件的問題所在:

·Wall qmake將會報告所有知道的警告信息。

·Wnone qmake不產生任何警告信息。

·Wparserqmake只產生詞法分析的警告。在解析你的pro文件的時候會警告你一些普通的缺陷和潛在問題。

·Wlogic qmake警告你在pro文件存在一些普通

Makefile 模式選項

qmake -makefile [options] files

在 Makefile 模式, qmake將會生成用於編譯工程的Makefile文件,另外下面的選項可能在本模式下使用,以影響工程文件的生成方式:

·after qmake將會在指定的文件后面處理一些命令行給出的任務

·nocache qmake將忽略。qmake.cache 文件。

·nodepend qmake將不產生任何依賴信息。

·cache file qmake將使用指定的緩沖文件file而忽略其他找到的.qmake.cache 文件。

·spec spec qmake將會使用spec作為平台的路徑和編譯器信息, 環境變量 QMAKESPEC 設置的值將會被忽略。

你也可以在命令行傳遞qmake參數;他們將會在所有的指定的文件之前處理:

qmake -makefile -unix -o Makefile “CONFIG+=test” test.pro

上面的意思就是,在unix模式下,使用test.pro加入test選項生成Makefile,但是一些指定的選項當他們是默認的情況是沒有必要的添加的,因此,如果在unix上就是下面的

qmake “CONFIG+=test” test.pro

如果你確定你自己想在指定的文件后面處理一些變量,你可以傳遞-after選項。當這個被指定時,命令行所有的任務在–after選項之后會被延遲,直到指定的文件傳進來了。

Project 模式選項

Project Mode Options

qmake -project [options] files

在工程模式,qmake將會生成pro文件。另外,你可以在本模式下添加下面的選項:

·r qmake將會遍歷目錄

·nopwd qmake將會不理會你當前工作目錄的源代碼文件而去使用指定的文件在這個模式.files變量可以是文件或者目錄的列表 如果指定一個目錄,將會包含進DEPENDPATH變量里面 目錄里面相關的代碼會被包含進生成的工程文件里面。 如果給的是文件, 將會添加到正確的變量, 這主要依賴於他們的擴展名(后綴名); 例如, .ui 文件會被添加到 FORMS(qt2是INTERFACES吧),

.cpp 文件會被添加到 SOURCES。在這個模式下。你也可以傳遞任務到命令行里面, 當這樣做的時候,這些任務將會放到生成pro文件之后。

一般先用project模式生成.pro文件,然后再將.pro文件qmake一次生成Makefile。

http://www.cnblogs.com/elect-fans/archive/2012/03/24/2415557.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM