转自: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文件内指定这些头文件路径和库文件
估计不少对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
和头文件比起来,库文件似乎就比较简单了。因为它们直接在下面的路径下
$QTDIR/lib
路径简单,可是库呢?
以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管理我们前面的例子的话,我们只需要写一个简单 .pro 文件
CONFIG += console
QT -= gui
SOURCES += main.cpp
这样一来,qmake是如何知道需要哪些头文件和库文件的呢?
其实,这儿省略了两行代码(因为是默认值,所以可以不写,但对我们理解这个例子至关重要)
CONFIG += qt
QT += core
那么这些东西如何和前面的东西联系起来呢?
首先
CONFIG += qt
将使得最终包含:
头文件路径 |
$QTDIR/include |
库文件路径 |
$QTDIR/lib |
其次
QT += core
将对Qt相关的路径进一步细化
头文件路径中 |
$QTDIR/include/QtCore |
链接需要的库 |
QtCore4.lib |
编译预处理的宏 |
QT_CORE_LIB |
看,现在头文件路径和库文件都有了,而且,无论头文件写成 QString 还是 !QtCore/QString 都能被找到。
再次,由于在 .pro 文件内
这使得这点变得更加隐藏
举个例子,如果我们在程序中用了
#include <QFtp>
...
QFtp xxx;
...
那么我们将需要
指定头文件路径 |
$QTDIR/include/QtNetwork |
指定要链接的库 |
QtNetWork4.lib |
这两个正是下面的语句所做的:
QT += network
哈哈哈,发现下面问题的答案了没:
忘记了QT+=network这样的语句,为什么有的人遇到的编译错误,有的人遇到的是链接错误?
当启用一个模块时,我们
这是最常规的,QtCore、QtGui、QtNetWork 等等
使用Core模块 |
QT += core |
使用Gui模块 |
QT += gui |
使用NetWork模块 |
QT+=network |
比如 QAxContainer 模块
CONFIG += qaxcontainer
比如 QtTest 模块:
我们可以使用
CONFIG += qtestlib
也可以使用
QT += testlib
两者的区别是,后者会定义 QT_TESTLIB_LIB 这样宏(同QT+= core gui等效果一样),前者则不会定义这个宏。