Qt *.pro编写一般规则
qmake 之 CONFIG 与 QT 乱谈
看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++中,使用第三方库的过程,就是包含头文件、链接库文件的过程:
使用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 += 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 文件内
- 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等效果一样),前者则不会定义这个宏。
Qt *.pro编写一般规则的更多相关文章
- 【整理】QT .pro文件中的变量说明
注释 以"#"开始的行,直到结束 模板变量 告诉qmake生成哪种makefile TEMPLATE = app 其中 app - 表示该工程建立一个应用程序的makefile.这 ...
- QT .pro文件中的变量说明
https://blog.csdn.net/tanou3212/article/details/79942840 TEMPLATE:定义了工程的编译模式 赋值方式为:TEMPLATE=app (1 ...
- 《玩转Django2.0》读书笔记-编写URL规则
<玩转Django2.0>读书笔记-编写URL规则 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. URL(Uniform Resource Locator,统一资源定位 ...
- Linux防火墙基础与编写防火墙规则
Iptables采用了表和链的分层结构,每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表,raw表,mangle表,nat表,filter表,每个表容器内包括不同的规则链,根 ...
- 03 编写URL规则
3-1 URL编写规则 # 在每个App中设置独立的静态资源和模板文件并添加一个空白内容的urls.py文件. # 当程序收到用户请求的时候,首先在根目录的urls.py查找该URL属于哪个APP,然 ...
- 利用Eric+Qt Designer编写倒计时时钟
[前言]前几日通过编写命令行通讯录,掌握了Python的基本语法结构,于是开始向更高水平冲击,利用Eric与Qt Designer 编写一个带界面的小程序.本次实操中也确实遇到了不少问题,通过学习也都 ...
- Qt Pro文件与Qt模块启用
看qt论坛中经常有人忘记 QT+=network 等语句.随便写写吧,或许对他人有帮助. 一.从哪开始呢 不妨先看个例子吧: #include <QtCore/QCoreApplication& ...
- Prometheus 编写告警规则案例
Prometheus 编写告警规则案例 注:确保alertmanager配置完毕! 1.创建编辑文件:vim /usr/local/prometheus/rules/node.yml # groups ...
- Cluster基础(一):配置iSCSI服务、编写udev规则、配置并访问NFS共享、部署Multipath多路径环境
一.配置iSCSI服务 目标: 本案例要求先搭建好一台iSCSI服务器,并将整个磁盘共享给客户端: 虚拟机添加新的磁盘 将新添加的磁盘分区并创建两个逻辑卷 逻辑卷名称分别为:/dev/myvg/isc ...
随机推荐
- HBase性能调优
因官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果.所以我以配置项驱动,重新整理了原文,并补充一些自己的理解,如有错误,欢迎指正. 配置优化 zo ...
- 孙鑫视频学习:关于Visual Studio 2010中MFC工程的消息WM_INITDIALOG找不到的问题
学习孙鑫的那个深入详解C++视频时,有一处给编辑框空间改写窗口过程函数的例子,其中需要添加一个WM_INITDIALOG消息响应函数,但在类向导的消息栏下找不到WM_INITDIALOG消息.解决方法 ...
- [转载]ExtJs4 笔记(11) Ext.ListView、Ext.view.View 数据视图
本篇介绍两个用来展示数据的容器控件,分别是Ext.ListView和Ext.view.View.Ext.ListView就是大名鼎鼎的 Ext GridPanel的前身,不过现在的Ext4已经将它整合 ...
- ZOJ 3232 It's not Floyd Algorithm --强连通分量+Floyd
题意:给你一个传递闭包的矩阵,mp[u][v] = 1表示u可以到达v,为0代表不可到达,问你至少需要多少条边组成的传递闭包符合这个矩阵给出的关系 分析:考虑一个强连通分量,如果这个分量有n个节点,那 ...
- 2014 Super Training #4 B Problem Arrangement --状压DP
原题:ZOJ 3777 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意:给每个题目安排在每个位置的value ...
- Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis
Redis真是好,其中的键值用起来真心强大啊有木有, 之前的文章讲过搭建了redis集群 那么咋们该如何调用单机版的redis以及集群版的redis来使用缓存服务呢? 先讲讲单机版的,单机版redis ...
- Adobe Scout 入门
http://www.adobe.com/cn/devnet/scout/articles/adobe-scout-getting-started.html Adobe Scout 是新一代 Flas ...
- 解析iOS开发中的FirstResponder第一响应对象
1. UIResonder 对于C#里所有的控件(例如TextBox),都继承于Control类.而Control类的继承关系如下: 代码如下: System.Object System.Marsha ...
- 一、IOS运行原理
1.首先执行main函数 2.执行UIPaalicationMain函数 3.UIApplication函数内部 1>创建一个UIApplication实例.这个UIApplication对象是 ...
- 【转】【WPF】TemplateBinding和Binding的区别
定义 TemplateBinding是为了某个特定场景优化出来的数据绑定版本--需要把ControlTemplate里面的某个Property绑定到应用该ControlTemplate的控件的对应Pr ...