Qt Pro文件与Qt模块启用
看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模块启用的更多相关文章
- Qt .pro文件详解
在我们创建Qt工程项目时,Qt Creator总会创建一个.pro文件,我们称.pro文件为Qt的工程管理文件.一个工程项目可以包含一个或多个.pro文件.理解和掌握pro文件的用法,将有利于Qt开发 ...
- 【整理】QT .pro文件中的变量说明
注释 以"#"开始的行,直到结束 模板变量 告诉qmake生成哪种makefile TEMPLATE = app 其中 app - 表示该工程建立一个应用程序的makefile.这 ...
- QT .pro文件中的变量说明
https://blog.csdn.net/tanou3212/article/details/79942840 TEMPLATE:定义了工程的编译模式 赋值方式为:TEMPLATE=app (1 ...
- QT pro文件解析
在QT中使用qmake自动生成pro文件,如果要自己定制工程选项,则需要自行修改pro文件. pro文件有以下关键字:TEMPLATE.TARGET.DESTDIR.DEPENDPATH.INCLUD ...
- QT pro文件详细写法+实例
很多的初学者都没有注意pro 文件的内容 今天简单的介绍一下 这个文件主要内容 TEMPLATE:这个变量是用来定义你的工程将被编译成什么模式.如果没有这个设置,系统将默认编译为application ...
- Qt .pro文件 详解
1. TEMPLATE变量TEMPLATE描述了为建立目标文件而采用何种模板,即生成何种形式的Makefile文件.Qmake工具定义了5种模板:1. 应用程序App,为建立一个Qt应用程序创建Mak ...
- QT .pro文件 LIBS用法详解
在程序中需要使用到团队其它成员开发的静态库和动态库,起初是知道使用LIBS变量在在.pro文件中指定需要包含的库,但是实际使用的时候却遇到很大麻烦,但其实确实是因为自己看官方文档不太用心造成的. 下面 ...
- Qt pro文件语法
在Qt下做开发的时候.pro文件就是工程的配置文件,虽然很多时候里面的选项是工具自动生成的,但是难免会需要手动修改的时候,下面就记录一下它的基本语法 #:在.pro文件中表示注释,注释当前行 TEMP ...
- QT .pro文件的学习收获
1. 载pro文件预定义宏: CONFIG(debug,debug|release){ DEFINES+=__DEBUG__ }else{ DEFINES+=__RELEASE__ macx:DEST ...
随机推荐
- [Real World Haskell翻译]第22章 扩展示例:Web客户端编程
第22章 扩展示例:Web客户端编程 至此,您已经看到了如何与数据库交互,解析一些数据,以及处理错误.现在让我们更进了一步,引入Web客户端库的组合. 在本章,我们将开发一个真正的应用程序:一个播客下 ...
- linux 网络编程 2---(TCP编程)
流程 服务器:server 创建套接字 socket( ) 填充服务器网络信息结构体 sockaddr_in 将套接字与服务器网络信息结构体绑定 bind( ) 将套接字设置为被动监听状态 liste ...
- 天津Uber优步司机奖励政策(12月28日到12月29日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Kafka在高并发的情况下,如何避免消息丢失和消息重复?kafka消费怎么保证数据消费一次?数据的一致性和统一性?数据的完整性?
1.kafka在高并发的情况下,如何避免消息丢失和消息重复? 消息丢失解决方案: 首先对kafka进行限速, 其次启用重试机制,重试间隔时间设置长一些,最后Kafka设置acks=all,即需要相应的 ...
- Machine Learning Basic Knowledge
常用的数据挖掘&机器学习知识(点) Basis(基础): MSE(MeanSquare Error 均方误差),LMS(Least MeanSquare 最小均方),LSM(Least Squ ...
- How To Install Apache Tomcat 7 on CentOS 7 via Yum
摘自:https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-7-on-centos-7-via-y ...
- uvaoj1339 - Ancient Cipher(思维题,排序,字符串加密)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Appium的一点一滴:Android KEYCODE键值
转自:http://blog.csdn.net/crisschan/article/details/50419963 - 电话键 键名 描述 键值 KEYCODE_CALL 拨号键 5 KEYCODE ...
- mysql新手进阶02
云想衣裳花想容,春风拂槛露华浓. 若非群玉山头见,会向瑶台月下逢. 现在有一教学管理系统,具体的关系模式如下: Student (no, name, sex, birthday, class) Tea ...
- 前端开发工程师 - 06.Mini项目实战 - 项目简介
第6章--Mini项目实战 项目简介 Mini项目简介-Ego社区开发 回顾: 页面制作 页面架构 JavaScript程序设计 DOM编程艺术 产品前端架构 实践课Mini项目--Ego: 主题:漫 ...