qmake 之 CONFIG 与 QT 乱谈
轉(zhuǎn)自:http://hi.baidu.com/cyclone/blog/item/d299af511bed309f8c5430c3.html
看qtcn論壇中經(jīng)常有人忘記 QT+=network 等語(yǔ)句。隨便寫(xiě)寫(xiě)吧,或許對(duì)他人有幫助。
寫(xiě)來(lái)寫(xiě)去,發(fā)現(xiàn)越寫(xiě)越亂,就這樣吧,反正主要的內(nèi)容很簡(jiǎn)單。 dbzhang800 20101116
從哪兒開(kāi)始呢?
不妨先看個(gè)例子吧:
#include <QtCore/QCoreApplication>#include <QtCore/QDebug>
int main(int argc, char** argv)
{
QCoreApplication app(argc, argv);
qDebug()<<"hello qt!";
app.exec();
}
如何編譯這個(gè)程序呢?我們知道,構(gòu)建一個(gè)C++程序:無(wú)非是編譯(包括編譯預(yù)處理)、鏈接 這幾步。
- 編譯時(shí),我們需要讓預(yù)處理器能找到我們的頭文件(即:指定頭文件路徑)
- 鏈接時(shí),我們需要讓鏈接器能找到我們需要的庫(kù)
對(duì)這個(gè)程序來(lái)說(shuō)呢,也就是,指定
| 頭文件路徑 | $QTDIR/include |
| 庫(kù)文件 | QtCore4.lib(或相應(yīng)的其他形式) |
答案就簡(jiǎn)單了(分別采用g++和msvc進(jìn)行編譯):
g++ main.cpp -Ie:\Qt\4.7.0\include -o main -Le:\Qt\4.7.0\lib -lQtCore4或
cl main.cpp -ID:/Qt/4.7.0/include -Femain -link -LIBPATH:D:/Qt/4.7.0/lib QtCore4.lib參數(shù)的含義可參考:從 C++ 到 Qt
頭文件 庫(kù)文件
我們知道,在C++中,使用第三方庫(kù)的過(guò)程,就是包含頭文件、鏈接庫(kù)文件的過(guò)程:
| 使用QString | 需要 -lQtCore4 |
| 使用QWidget | 需要 -lQtGui4 |
| 使用QFtp | 需要 -lQtNetWork4 |
| 使用QWebView | 需要 -lQtWebKit4 |
| ... | ... |
我們接下來(lái)先簡(jiǎn)單看一下Qt的頭文件和庫(kù)文件,然后看看qmake是如何處理的:為什么我們不需要在.pro文件內(nèi)指定這些頭文件路徑和庫(kù)文件
Qt頭文件
估計(jì)不少對(duì)C、C++不是那么熟的同仁,會(huì)對(duì)Qt中的下面各種寫(xiě)法感到迷惑(比如我們要用到 QString 的頭文件):
-
#include<QString>
-
#include<QtCore/QString>
-
#include<string.h>
-
#include<QtCore/string.h>
不過(guò)咱們都是學(xué)過(guò)C、C++的,都知道尖括號(hào)或雙引號(hào)內(nèi)就是一個(gè)頭文件的文件名。所以理解起來(lái)應(yīng)該沒(méi)什么難度,轉(zhuǎn)來(lái)轉(zhuǎn)去無(wú)非是下面的幾個(gè)文件:
-
$QTDIR/include/QtCore/QString
-
$QTDIR/include/QtCore/qstring.h
所以呢?當(dāng)你
| 使用頭文件 | 需要指定頭文件路徑 |
| #include<QString> | $QTDIR/include/QtCore |
| #include<QtCore/QString> | $QTDIR/include |
有些人喜歡用#include<QtCore>這種寫(xiě)法,這是頭文件在哪兒呢?它的全路徑是
$QTDIR/include/QtCore/QtCore與此類似
| 使用頭文件 | 需要指定頭文件路徑 |
| #include<QtCore> | $QTDIR/include/QtCore |
| #include<QtGui> | $QTDIR/include/QtGui |
| #include<QtScript> | $QTDIR/include/QtScript |
| ... | ... |
不清楚你注意到?jīng)]?如果你堅(jiān)持使用 #include<QtCore/QString> 這種寫(xiě)法,你只需要一個(gè)頭文件路徑,這就是$QTDIR/include
Qt庫(kù)文件
和頭文件比起來(lái),庫(kù)文件似乎就比較簡(jiǎn)單了。因?yàn)樗鼈冎苯釉谙旅娴穆窂较?/p>
-
$QTDIR/lib
路徑簡(jiǎn)單,可是庫(kù)呢?
- 動(dòng)態(tài)庫(kù)(共享庫(kù))、靜態(tài)庫(kù)(歸檔庫(kù))
- 不同平臺(tái)下有不同的后綴。 .dll, .so, .dylib, .lib, .a
- 帶調(diào)試信息,不帶調(diào)試信息的庫(kù)
- windows下的動(dòng)態(tài)庫(kù)需要引導(dǎo)庫(kù)
以windows下MSVC編譯的Qt4為例:
- 靜態(tài)編譯
-
$QTDIR/lib/QtCore.lib
-
$QTDIR/lib/QtCored.lib
-
- 動(dòng)態(tài)編譯
-
$QTDIR/lib/QtCore4.lib
-
$QTDIR/lib/QtCore4.dll
-
$QTDIR/lib/QtCored4.lib
-
$QTDIR/lib/QtCored4.dll
-
qmake
用qmake管理我們前面的例子的話,我們只需要寫(xiě)一個(gè)簡(jiǎn)單 .pro 文件
CONFIG += consoleQT -= gui
SOURCES += main.cpp
這樣一來(lái),qmake是如何知道需要哪些頭文件和庫(kù)文件的呢?
其實(shí),這兒省略了兩行代碼(因?yàn)槭悄J(rèn)值,所以可以不寫(xiě),但對(duì)我們理解這個(gè)例子至關(guān)重要)
CONFIG += qtQT += core
那么這些東西如何和前面的東西聯(lián)系起來(lái)呢?
首先
CONFIG += qt將使得最終包含:
-
頭文件路徑
$QTDIR/include
庫(kù)文件路徑
$QTDIR/lib
其次
QT += core將對(duì)Qt相關(guān)的路徑進(jìn)一步細(xì)化
-
頭文件路徑中
$QTDIR/include/QtCore
鏈接需要的庫(kù)
QtCore4.lib
編譯預(yù)處理的宏
QT_CORE_LIB
看,現(xiàn)在頭文件路徑和庫(kù)文件都有了,而且,無(wú)論頭文件寫(xiě)成 QString 還是 !QtCore/QString 都能被找到。
再次,由于在 .pro 文件內(nèi)
- CONFIG 中默認(rèn)包含 qt
- QT 中默認(rèn)包含 core
這使得這點(diǎn)變得更加隱藏
QT
舉個(gè)例子,如果我們?cè)诔绦蛑杏昧?/p> #include <QFtp>
...
QFtp xxx;
...
那么我們將需要
-
指定頭文件路徑
$QTDIR/include/QtNetwork
指定要鏈接的庫(kù)
QtNetWork4.lib
這兩個(gè)正是下面的語(yǔ)句所做的:
QT += network- 除此,該語(yǔ)句還定義宏 QT_NETWORK_LIB
哈哈哈,發(fā)現(xiàn)下面問(wèn)題的答案了沒(méi):
-
忘記了QT+=network這樣的語(yǔ)句,為什么有的人遇到的編譯錯(cuò)誤,有的人遇到的是鏈接錯(cuò)誤?
- 因?yàn)闆](méi)有頭文件路徑,編譯時(shí)就會(huì)找不到頭文件。(但如果寫(xiě)成 QtNetWork/QFtp ,則不會(huì)有這個(gè)問(wèn)題。)
- 因?yàn)闆](méi)有指定鏈接庫(kù),即使頭文件找到了,鏈接時(shí)也肯定會(huì)遇到問(wèn)題的。(答案很明顯吧)
如何啟用一個(gè)模塊
當(dāng)啟用一個(gè)模塊時(shí),我們
- 要么是修改 CONFIG 變量
- 要么是細(xì)化 QT 變量
- 而有的模塊,兩者均可。
修改QT
這是最常規(guī)的,QtCore、QtGui、QtNetWork 等等
-
使用Core模塊
QT += core
使用Gui模塊
QT += gui
使用NetWork模塊
QT+=network
修改CONFIG
比如 QAxContainer 模塊
CONFIG += qaxcontainer兩者均可
比如 QtTest 模塊:
我們可以使用
CONFIG += qtestlib也可以使用
QT += testlib兩者的區(qū)別是,后者會(huì)定義 QT_TESTLIB_LIB 這樣宏(同QT+= core gui等效果一樣),前者則不會(huì)定義這個(gè)宏。
轉(zhuǎn)載于:https://www.cnblogs.com/hnrainll/archive/2011/05/20/2052335.html
總結(jié)
以上是生活随笔為你收集整理的qmake 之 CONFIG 与 QT 乱谈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我治大学生抄作业毛病的办法——兼答丁又专
- 下一篇: TP-Link無線路由器(分享器)頻寬控