转自: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 -= guiSOURCES += 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 文件内

  • 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 乱谈相关推荐

  1. qmake 乱乱乱谈(一)

    不想太深入地去看qmake,可是,左等,右等,总不见Qt新的构建系统有什么新消息.还是整理一下qmake吧,由于没什么主题,还不知道本文最终会乱到什么程度. 注:你可能会对下面的内容感兴趣. 浅谈 q ...

  2. qmake 乱乱乱谈(二)

    接前面qmake 乱乱乱谈(一),继续看看qmake. 暂定主题:qmake之命令行参数及qmake启动时加载了什么东西,或许可以借此学习一下qmake是处理命令行参数的方法 命令行参数 运行 qma ...

  3. qmake 乱乱乱谈(三)

    接前面的qmake 乱乱乱谈(一)以及qmake 乱乱乱谈(二),本文看看qmake中的函数(Manual中有的就不重复了). 函数分两种: 内置函数 (qmake Manual中列出的属于此类) 自 ...

  4. [置顶]       jQuery乱谈(六)

    接上一篇:jQuery乱谈(五),今天分析removeClass().removeProp().toggleClass().val().  removeClass(): /** * removeCla ...

  5. 雷兽的数据库CAP乱谈之(一)阐述

    雷兽的数据库CAP乱谈之(一)阐述 今天有人问我cap,找了https://my.oschina.net/lilw/blog/169776这片文字, 下面是cap那篇文字的解释: 所谓CAP理论,即: ...

  6. 乱谈互联网产品开发(二)

    潜意识里,我一直认为网站开发是没有技术含量的.由于我一直在软件公司做组件,底层等相关技术的研究和开发,只要看到跟界面相关的系统就会没工作激情.对"网页开发"之类的东西就更心存鄙夷. ...

  7. centos 计算器_计算初学者进行服务器centos 7.6系统及orca、xtb、gaussian 16软件的安装乱谈...

    本帖最后由 欢乐多 于 2020-8-18 10:37 编辑 自己动手丰衣足食--计算初学者进行服务器centos 7.6系统及orca.xtb.gaussian 16软件的安装乱谈 经过一夜苦战通宵 ...

  8. 菜鸟的AI安全乱谈(2)—通过模型再训练留后门

    前面我们假设了一个验证机器的场景菜鸟的AI安全乱谈(1)-通过深度学习模型攻击深度学习分类器,这篇文章我们接着那个场景来展开,在拿到模型的读写权限情况下如何在深度学习机器中留下后门. 那么,如何在深度 ...

  9. 转载:编剧技巧思路乱谈

    http://hgs521.com/html/dongmanjiaocheng/juben/20080130/41.html 编剧技巧思路乱谈 经常有朋友感到没有故事好写,或者在一个故事上苦苦思索,最 ...

最新文章

  1. 数学图形(2.8)Viviani曲线
  2. python贴吧爬虫-Python爬虫——抓取贴吧帖子
  3. java学习与总结:反射及动态代理
  4. http断点续传原理:http头 Range、Content-Range
  5. cmake--gccxml
  6. java传送字符到前端_mina实现服务器与客户端传送对象或字符串
  7. flask 知识点总结
  8. mysql备份 where_MySQL备份与还原
  9. java 程序流程控制知识点_JAVA基础知识点梳理三:流程控制语句
  10. CSDN用户服务条款
  11. Cocos Creator学习のTiledMap
  12. 线性时间选择(C++):求第k小的数
  13. kindle刷机ttl_kindle咕咪版如何刷成普通kindle版本?
  14. inno setup 打包工具介绍
  15. 一箭N雕:多任务深度学习实战
  16. win7进程中的svchost.exe占用CPU和内存很高的原因和解决窍门
  17. 业务口堆叠和堆叠子卡_通过堆叠最酷的库来构建和部署简单的ml工具
  18. i3 7100黑苹果_苹果连发三款新品,售价更低!性能更强!| 数码
  19. 同居关系解除后,财产如何分割
  20. vue Component inside <Transition> renders non-element root node that cannot be animated.

热门文章

  1. 如何让hybris启动加快
  2. Spark内核以及源码解析
  3. 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(下)
  4. iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET
  5. 使用DocFX生成文档
  6. ICMP Internet控制报文协议(四)
  7. 科普| 什么是图数据库?
  8. Spring Job?Quartz?XXL-Job?年轻人才做选择,艿艿全莽~
  9. 300 行代码带你搞懂 Java 多线程!
  10. Spring Boot Elasticsearch 入门