Qt工程管理
Qt Creator工程管理
Qt Creator以工程项目的方式对源码进行管理
一个Qt Creator工程包含不同类型的文件
.pro项目描述文件
.pro.user用户配置描述文件 //由Qt Creator自动生成的,
//所以说它里面的配置信息不需要我们手工的去修改,由Qt Creato自动去维护
.h头文件
.cpp源文件
.ui界面描述文件
资源文件(图片,音频等)
.pro项目描述文件的基本构成
-#-注释起始符
-QT-模块声明 :指明当前项目中需要用到哪些模块
-TARGET-可执行文件名
-TEMPLATE-程序模板声明
-SOURCES-源码文件声明
-HEADERS-头文件声明
-FORMS-界面文件声明
-RC_FILE-资源文件声明
.pro项目描述文件中的高级变量
-INCLUDEPATH-头文件搜索路径
-CONFIG-设定项目的配置信息和编译选项
-LIBS-添加第三库文件(比如说在别的文件里面已经写好了一个库文件,这个库文件又可以直接拿过来使用,此时就可以使用LIBS这个关键变量来进行添加)
-DEFINES-定义编译宏
CONFIG配置
CONFIG用于设定项目的配置信息和编译选项
CONFIG的常用选项
-debug-构建debug版本的可执行程序
-release-构建release版本的可执行程序
-debug_and_release-同时构建debug版和release版
-warn_on-尽可能多的输出警告信息
-warn_off-不输出警告信息
.pro文件的本质为Qt中的Makefile文件

.pro文件为Qt平台上的Makefile。那这种Makefile能够真正的知道编译器来进行项目编译吗?
.pro文件其实办不到,既然办不到为什么说它是Makefile呢?它其实做了一个中间层的转换
.pro通过qmake这个Qt平台提供的命令行工具之后,就会生成具体平台上的Makefile文件
同一个.pro项目描述文件通过不同平台的qmake就能生成不同平台的Makefile文件。之后在不同
平台下调用当前平台的c++编译器就可以编译生成当前平台的可执行程序。这就是Qt所谓的跨平台开发原理了。
Qt用于屏蔽不同操作系统一些细节上面的差异,提供一个统一的平台给开发者。开发者在这个统一的平台上写的
代码就可以编译到不同平台的上面去。
屏蔽的手段就是提供一些抽象的文件出来。比如说,.pro项目描述文件(其实就是抽象出来的Makefile文件)
接下来分析一个.pro文件的实例:
/*
Qt是一个关键变量,作用是模块的声明,此处使用的是两个模块core、gui
Qt不仅仅是一个界面开发库,它可以说是一个开发平台,它不仅仅提供开发界面需要的一些类,还
提供了比方说数据库连接类、多线程类、网络连接类等等。因此在Qt中必须将这些类分到不同的模块
里面。一些叫做核心模块,一些叫做gui模块。很显然,当前项目中将会用到Qt的一些核心类、界面开发类
*/
QT += core gui
/*
当前使用的Qt版本大于4,则执行后面那条语句。假设当前使用的Qt版本是5,这个时候就需要告诉Qt,
我们还需要使用一个模块,叫做widgets
*/
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
/*
TARGET指明最后可执行文件名,在windows下为HelloWorld.exe,在linux下为HelloWorld.out
TEMPLATE:指明HelloWorld是一个什么类型的程序,在此指明它是一个app,也就是一个可执行程序。
换句话说当前的项目需要编译出来的是可执行程序,而不是库文件
*/
TARGET = HelloWorld
TEMPLATE = app
/*指明头文件的搜索路径*/
INCLUDEPATH += E:/BCC/include \
E:/VC/include
SOURCES += Main.cpp \
HelloWorld.cpp
HEADERS += HelloWorld.h
FORMS += HelloWorld.ui
RC_FILE += MyIco.rc
/*
用来指明需要用到的外部库,这个外部库放在此路径下。当编译完成后,需要进行链接时就可以搜索
对应的路径找一些库文件
*/
LIBS += -LE:/vlc-1.11/sdk/lib
/*CONFIG用于设定项目的配置信息和编译选项*/
CONFIG += warn_on debug
#
# if 'debug' option is set for CONFIG
#
/*测试CONFIG中有没有设置debug信息。如何进行测试呢,利用CONFIG(debug)
如果设置了,会做什么事情呢?
首先,定义一个宏,宏的名字为DEBUG_LOG;并且告诉编译器编译编译两个新文件:DebugLog.cpp,DebugLog.h*/
CONFIG(debug) {
DEFINES += DEBUG_LOG
SOURCES += DebugLog.cpp
HEADERS += DebugLog.h
}
项目文件
一般来说,项目文件中的描述符都使用相对路径。而相对路径是相对于项目本身而言的。
Qt Creator将项目文件作为目标文件
注意:
1、Qt Creator在打开项目文件的同时会生成.pro.user文件
2、.pro.user文件包含一些与Qt相关的本地配置信息
3、当需要在不同计算机之间移动项目源码时,建议删除.pro.user文件
.pro.user文件是项目配置的一部分,只不过这一部分是由Qt Creator来维护的,与开发者没有任何的关系。
所以说没必要打开这个文件来阅读、分析、修改,这件事是Qt Creator的事情,与开发者无关。
为什么需要.pro.user这个文件呢?
因为我们非常有可能将整个项目从windows操作系统拷贝到linux操作系统下接着进行开发,所以说非常有
必要用另一个文件来记录本地的信息。然而这些本地的信息对于开发者来说,又必须是隐蔽的。
Qt为什么要这么做?
因为它想屏蔽不同平台的一些差异,使开发者始终感觉面对统一的平台来开发应用程序
工程中的概念
构建(build)
——对项目中的所有文件进行编译,最终生成可执行程序
Debug版
——可以进行程序调试的构建版本
——可执行程序中包含调试信息,运行效率不高
Release版(好的做法:阶段性的进行Release构建)
——最终发布的应用程序构建版本
——无调试信息,运行效率高
Qt工程管理的更多相关文章
- 类似Visual Studio一样,使用Qt Creator管理多个项目,创建子项目
1. 简介 QtCreator是一个十分好用的跨平台IDE,由于最近需要在Windows和Mac同时写一个C++的代码,使用VS和XCode不能实现项目的统一管理(可以使用cmake来组织源码,但是每 ...
- Qt工程文件说明
Qt工程文件说明 2017-10-16 天天快乐6... 转自 LZS2851 修改 微信 分享: 这篇文章是我从360doc上转的,本来是要把转的url列出来的,但是它们居然禁掉了复制,而且 ...
- Qt工程打包发布
Qt版本 5.7.1 1.添加环境变量 在..\Qt5.7.0\5.7\msvc2013_64\bin(..省略了盘符,例如我的是D:\Qt\Qt5.7.0\5.7\msvc2013_64\bin) ...
- Qt 工程 pro文件
工作中,感觉pro文件的有些内容真不太懂,现系统性的学习一下.于此备录,分享共勉. 为了更好的理解,先创建一个简单的工程作为实践. [1]创建一个pro文件 1.1 新建proDemo工程.步骤如下: ...
- 使用BLADE构建c++工程管理
使用BLADE构建c++工程管理 字数764 阅读2753 评论2 喜欢4 一. c++工程依赖管理 之前在百度一直使用comake2构建c++项目,十分方便.免去了手写Makefile的痛苦,很多项 ...
- emacs工程管理,cedet ede插件自动构建Make,Automake
鉴于自己一直都是在做客户端开发方面的工作,服务端很多知识都随着时间淡忘了,最近有一个计划,用一些时间补一下基础.所以早上很早就起床,花了一点时间大致浏览了一下BSD socket的相关API,然后用G ...
- 第六章 Qt布局管理器Layout
第六章 Qt布局管理器Layout 大家有没有发现一个现象,我们放置一个组件,给组件最原始的定位是给出这个控件的坐标和宽高值,这样Qt就知道这个组件的位置.当用户改变窗口的大小,组件还静静地呆在原来的 ...
- Qt 内存管理机制(转)
许转载http://devbean.blog.51cto.com/448512/526734 强类型语言在创建对象时总会显式或隐式地包含对象的类型信息.也就是说,强类型语言在分配对象内存空间时,总 ...
- Makefile 工程管理
Makefile 工程管理 Makefile 规则 --变量 在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量 $^:代表所有的依赖文件 $@:代表目标 $&l ...
随机推荐
- c# 第36节 接口的声明
本节内容: 1:字面理解接口 2:计算机的接口是什么呢 3:接口的声明 4:接口的注意点 1:字面理解接口 大家现在手机上,可能有很多app软件,比如天气预报的软件,有很多种,什么墨迹天气啊之类的等等 ...
- apache配置文件详解(中英文对照版)
# This is the main Apache server configuration file. It contains the # configuration directives that ...
- 攻防世界Web-bug
一直误以为是二次注入,看了别人wp,自己梳理了一遍 首先打开题目页面 先注册一个账号 注册成功(注意这个UID) 然后注意下包,发现cookie中的user很可疑,是一串md5值,我们可以推测是我们注 ...
- Java基本数据类型转换一
public class TestConvert { /**容量小的类型自动转化为容量大的类型数据类型按容量大小排列 * byte,short,char -> int ->long-> ...
- jmeter录制移动端脚本
jmeter录制脚本有两种方式,一种借助外部工具badbody,一种是本身的功能,使用代理服务器,介绍下如何使用代理服务器录制脚本.我一般在测app或者移动端H5页面时才会录制,所以此文也针对移动端. ...
- 剑指Offer-3.从尾到头打印链表(C++/Java)
题目: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 分析: 很简单的一道题,其实也就是从尾到头打印链表,题目要求返回ArrayList,其实也就是一个数组. 可以将链表中的元素全部 ...
- yii2-CaptchaAction macos500 不显示
把公司一个项目pull到本地 发现验证码不输出了 怀疑是gd库没装 php -m看了下 gd库是装了的 有搜索到可能是因为自带的php拓展生成不了png(觉得不太可能) 试了下自己写一个图片生成pn ...
- 解释JUnit中@BeforeClass和@AfterClass标注的方法必须是static的,而在TestNg不必
在JUnit中@BeforeClass和@AfterClass标注的方法必须是static的:但是在TestNg中却没有这样的限制,这是为什么呢. 其实和他们两的运行机制有关. 在junit中: 每运 ...
- bzoj2093 Frog
题目链接 思路 非常有趣的一道题. 先考虑如何找出第K远的位置. 因为给出的序列是单调的,所以对于位置\(i\)的前\(K\)远位置肯定是一个包含位置\(i\)的长度为\(k+1\)的区间.我们用\( ...
- ORB-SLAM2初步--局部地图构建
一.局部地图构建简介 为什么叫“局部”地图构建,我的理解是这个线程的主要任务是像地图中插入关键帧(包括地图点等信息),以及需要进行LocalBA优化一个局部地图,这是相对于回环检测时进行的全局优化来说 ...