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