看qt论坛中经常有人忘记 QT+=network 等语句。随便写写吧,或许对他人有帮助。

一、从哪开始呢

不妨先看个例子吧:

#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++) g++  main.cpp  -Ie:\Qt\4.7.0\include  -o  main  -Le:\Qt\4.7.0\lib  -lQtCore4

(msvc) cl  main.cpp  -ID:/Qt/4.7.0/include  -Femain   -link  -LIBPATH:D:/Qt/4.7.0/lib  QtCore4.lib

我们知道,在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

四、Qt pro文件

用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

现在头文件路径和库文件都有了,而且无论头文件写成 <QtCore/QString> 还是<QString> 都能被找到。

再次,由于在 .pro 文件内:CONFIG 中默认包含 qt;QT 中默认包含 core,这使得这点变得更加隐藏。

举个例子,如果我们在程序中用了

#include <QFtp>
...
QFtp xxx;
...

那么我们将需要

指定头文件路径

$QTDIR/include/QtNetwork

指定要链接的库

QtNetWork4.lib

这两个正是下面的语句所做的:

QT +=
network

除此,该语句还定义宏
QT_NETWORK_LIB

哈哈哈,发现下面问题的答案了没:

忘记了QT+=network这样的语句,为什么有的人遇到的编译错误,有的人遇到的是链接错误?

因为没有头文件路径,编译时就会找不到头文件。(但如果写成 QtNetWork/QFtp ,则不会有这个问题。)

因为没有指定链接库,即使头文件找到了,链接时也肯定会遇到问题的。(答案很明显吧)

五、启用Qt模块

当启用一个模块时,我们要么是修改 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等效果一样),前者则不会定义这个宏。

Qt Pro文件与Qt模块启用的更多相关文章

  1. Qt .pro文件详解

    在我们创建Qt工程项目时,Qt Creator总会创建一个.pro文件,我们称.pro文件为Qt的工程管理文件.一个工程项目可以包含一个或多个.pro文件.理解和掌握pro文件的用法,将有利于Qt开发 ...

  2. 【整理】QT .pro文件中的变量说明

    注释 以"#"开始的行,直到结束 模板变量 告诉qmake生成哪种makefile TEMPLATE = app 其中 app - 表示该工程建立一个应用程序的makefile.这 ...

  3. QT .pro文件中的变量说明

      https://blog.csdn.net/tanou3212/article/details/79942840 TEMPLATE:定义了工程的编译模式 赋值方式为:TEMPLATE=app (1 ...

  4. QT pro文件解析

    在QT中使用qmake自动生成pro文件,如果要自己定制工程选项,则需要自行修改pro文件. pro文件有以下关键字:TEMPLATE.TARGET.DESTDIR.DEPENDPATH.INCLUD ...

  5. QT pro文件详细写法+实例

    很多的初学者都没有注意pro 文件的内容 今天简单的介绍一下 这个文件主要内容 TEMPLATE:这个变量是用来定义你的工程将被编译成什么模式.如果没有这个设置,系统将默认编译为application ...

  6. Qt .pro文件 详解

    1. TEMPLATE变量TEMPLATE描述了为建立目标文件而采用何种模板,即生成何种形式的Makefile文件.Qmake工具定义了5种模板:1. 应用程序App,为建立一个Qt应用程序创建Mak ...

  7. QT .pro文件 LIBS用法详解

    在程序中需要使用到团队其它成员开发的静态库和动态库,起初是知道使用LIBS变量在在.pro文件中指定需要包含的库,但是实际使用的时候却遇到很大麻烦,但其实确实是因为自己看官方文档不太用心造成的. 下面 ...

  8. Qt pro文件语法

    在Qt下做开发的时候.pro文件就是工程的配置文件,虽然很多时候里面的选项是工具自动生成的,但是难免会需要手动修改的时候,下面就记录一下它的基本语法 #:在.pro文件中表示注释,注释当前行 TEMP ...

  9. QT .pro文件的学习收获

    1. 载pro文件预定义宏: CONFIG(debug,debug|release){ DEFINES+=__DEBUG__ }else{ DEFINES+=__RELEASE__ macx:DEST ...

随机推荐

  1. uCrop 源码剖析

    GitHub: uCrop, 版本为 2.2.2 主要是探究一下内部对于图片按比例的裁剪以及压缩, 应该会更很长一段时间 疑惑点 这里记下一些源码分析过程中遇到的疑惑点 sample/src/main ...

  2. 优步UBER司机高峰小时保底奖励

    高峰小时保底奖励 (此奖励仅针对6月1日及以后激活的优步车主): ​ 得到“高峰小时保底”的前提为: 1. 在规定高峰时间段内(不得跨段计算),任意一小时内至少完成一单: 2. 在规定高峰时间段内,任 ...

  3. 阅读笔记《JavaScript高级程序设计》

    0. 严格模式 "user strict" (1整个脚本顶部,2函数体顶部) 1. 数据类型 undefined -- 未定义 boolean string number obje ...

  4. tcpdump使用

    1. tcpdump选项 它的命令格式为: tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ][ -s ...

  5. OSG-获取OSG的源代码和第三方库并编译

    获取OSG的源代码有很多方式. 这里说下其中的两个地方,第一就是中国的OSG网站http://www.osgchina.org/,这个网站目前应该是由中国西安恒歌科技维护,同时,西安恒歌科技也是一家已 ...

  6. ReadyAPI 教程和示例(二)

    声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 接上一篇: 4.修改SoapUI测试 本节将演示如何为测试用例添加测试步骤以及更改请求参 ...

  7. 第三十九篇 Python异常处理

    一. 什么是异常 异常就是程序运行时发生的错误,在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止,在python中,错误触发的异常如下 错误分成两种: #语法 ...

  8. Siki_Unity_1-5_见缝插针

    1-5 见缝插针 任务1:资源下载 任务2:案例演示 任务3:创建工程和场景 Project Name:StickPin import素材,为两张png图 创建各个分类文件夹Scenes/ Prefa ...

  9. 几个常见移动平台浏览器的User-Agent

    之前介绍的手机站跳转url的一片文稿中提到,依据User Agent判断终端的方法.(文章地址:http://www.cnblogs.com/dereksunok/p/3664169.html ) 若 ...

  10. jQuery 对象 与 原生 DOM 对象 相互转换

    区别 jQuery 选择器得到的 jQuery对象 和 原生JS 中的document.getElementById() document.querySelector取得的 DOM对象 是两种不同类型 ...