当前位置: 首页 > news >正文

qmake手册(初级部分)

<!-- end copyright -->
原文链接: http://www.cuteqt.com/blog/?p=556
<!-- end index -->

qmake是一个帮助在不同平台上简化编译步骤的工具,她是来自Trolltech,qmake能够自动生成Makefile 使得只需要少量的信息就可以创建相应的Makefile,qmake能用于很多的软件工程,不管该软件工程是否是用qt写的.

qmake能生成Makefile主要是以工程文件里面的信息为基础.工程文件是开发者创建的,通常是很简单的.但是一些复杂的工程需要创建复杂的工程文件文件,qmake包含别的特性来支持qt开发.自动的包含uicmoc的编译规则.qmake也可以生成Microsoft Visual studio的工程文件而不要求开发者改变qt的工程文件

Getting Started 开始把

qmake指南 和 qmake 常用工程 提供了浏览,以便帮助新手开始qmake的使用

下面的就是连接了

  • qmake Tutorial qmake指南
    • Starting off Simple 从简单易懂开始
    • Making an Application Debuggable 使得程序可调试
    • Adding Platform-Specific Source Files 添加特殊平台的源文件
    • Stopping qmake If a File Doesn’t Exist 停止qmake如果文件不存在
    • Checking for More than One Condition 检查更多条件
  • qmake Common Projects
    • Building an Application 编译成可执行程序
      • The app Template app模板
    • Building a Library 编译成库
      • The lib Template 库模板
    • Building a Plugin 编译成插件
      • Building a Qt Designer Plugin 编译成qt designer的插件
    • Building and Installing in Debug and Release Modes 调试模式和发布模式的编译和安装
      • Building in Both Modes 两种模式同时编译
      • Installing in Both Modes 两种模式同时安装

qmake指南

本指南教导你怎么使用qmake,我们建议你看完了本指南后去阅读一下qmake用户手册

从简单易懂的开始

我们假设你完成了一个你的程序基本文件建立.比如下面的文件

  • hello.cpp
  • hello.h
  • main.cpp

你可以在你的qt的安装目录的examples/qmake/tutorial里面找到这些文件.首先使用一个你喜欢的编辑器创建一个叫hello.pro的文件,第一件你要做的事情是添加一行字 来告诉qmake 关于头文件和源文件是你的工程的组成部分

我们将先添加源文件到工程文件,你需要使用SOURCES 变量来做这件事情.新起一行写上 SOURCES += 后面跟着hello.cpp 例如

SOURCES += hello.cpp

我们重复做同样的事情 来添加源文件到工程文件里面,最后就成了下面的样子

SOURCES += hello.cpp

SOURCES += main.cpp

如果你喜欢使用Makefile的语法风格,可以写成下面的形式

SOURCES = hello.cpp \

main.cpp

现在源文件已经列在了工程文件里面了,接下来添加头文件,他们也是用同样的方法添加,不同的是变量名是HEADERS

做了这步的话,我们的工程文件应该是下面的样子了

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

一般情况下编译出来的目标的名字自动设置成跟工程文件名一样的名字,但是根据不同的系统加上了适当的后缀名,比如,你的工程文件名叫hello.pro那么目标在windows就是hello.exe而在Unix就是hello,如果你想使用一个不同的名字,你可以在工程文件名里面加入以下设置

TARGET = helloworld

最后的一个步骤就是设置 CONFIG 变量 由于这是一个qt的程序,我们需要把qt加入到CONFIG变量里面 以便qmake能够添加相关需要链接的qt的库和确保mocuic能包含到将要生成的Makefile里面

最后看到的完成的工程应该是下面的样子了

CONFIG += qt

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

现在你可以使用 qmake来生成你的程序需要的Makefile,在命令行里面到你的工程所在的目录输入以下的:

qmake -o Makefile hello.pro

接着输入make还是nmake 就依赖你的编译器了,如果是vs或者vc的就输入nmake,否则就输入make

对于Visual Studio使用者qmake 还可以生成 .dsp 或者.vcproj 文件 例如:

qmake -tp vc -o hello.dsp hello.pro

使得程序可调试

一个Release版本的程序没有包含任何调试符合或者其他的调试信息,在开发过程中,给程序提供调试版本的的相关信息是十分有用的.在工程文件里面的CONFIG加上debug就可以轻松做到了,例如

CONFIG += qt debug

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

qmake作用上面的的工程文件生成Makefile,你就会可以在调试环境中获取你程序运行时有用的调试信息

添加平台相关的源文件

当你编码了一段时间后,你的程序可能要做一些平台相关的东西,并且决定保持平台相关的代码独立性.因此你要做成2个新的文件来包含到你的pro文件, hellowin.cpp and hellounix.cpp 我们不能都把这2个文件添加到SOURCES变量中啊,因为将会在Makefile文件里面包含这2个文件啊.所以,我们要做的就是使用一个域的东西来使得qmake能处理这样的平台相关的问题.

假如在Windows,一个简单的域像下面那样添加进去

win32 {

SOURCES += hellowin.cpp

}

因此,如果是在Windows下运行qmake,就把hellowin.cpp添加到源文件链表里面,如果在别的平台运行qmake,就会忽略他.那么剩下来要做的就是创建一个unix平台相关的域了.

当你做完了,你的pro文件应该像下面看到的样子了

CONFIG += qt debug

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

win32 {

SOURCES += hellowin.cpp

}

unix {

SOURCES += hellounix.cpp

}

像前面一样,使用qmake来生成Makefile

如果文件不存在停止qmake

如果某写特定的文件不存在,你可能想不要创建Makefile,我们可以通过使用exists()函数检查一个文件是否存在,我们使用error()函数可以停止qmake 的处理进程.这些都是域的做法一样.只不过用函数简单的替代域.检查main.cpp文件的例子如下:

!exists( main.cpp ) {

error( “No main.cpp file found” )

}

!符号是用来否定的,例如,如果main.cpp文件存在则exists( main.cpp )结果为真.如果文件不存在!exists( main.cpp )结果则为真

CONFIG += qt debug

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

win32 {

SOURCES += hellowin.cpp

}

unix {

SOURCES += hellounix.cpp

}

!exists( main.cpp ) {

error( “No main.cpp file found” )

}

像前面一样,使用qmake来生成Makefile,如果你暂时重命名了main.cpp qmake的话,你就会看到一条消息并且qmake停止处理

多条件的检查

假如你使用Windows系统,你希望当运行程序的时候,能在命令行里面看到qDebug()输出的打印语句.除非你使用一些控制台设置来编译你的程序,否则你是看不到输出的.CONFIG变量中加入 console ,Window系统的Makefile就会有控制台的设置了,要说清楚的是,我们只想在windows系统和debug也已经添加到CONFIG里面的时候才添加控制台,这就要求两层域了,先创创建一个域,然后在里面创建另外一个域,添加设置到最里面的的域,如下

:

win32 {

debug {

CONFIG += console

}

}

嵌套的域可以用冒号来连接起来,所以最有的工程的样子就是下面的了

CONFIG += qt debug

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

win32 {

SOURCES += hellowin.cpp

}

unix {

SOURCES += hellounix.cpp

}

!exists( main.cpp ) {

error( “No main.cpp file found” )

}

win32:debug {

CONFIG += console

}

好了,你现在已经完成了qmake的旅途了,开始准备为自己的开发工程写工程文件吧

qmake Common Projects

本章节讲述为3种不同类型的基于Qt的工程设置pro文件,尽管所有的工程有很多相同的变量,但是他们每个使用工程属性相关的变量来定制输出文件.

平台专门的变量不在这里讲述, 我们建议读者去 Deploying Qt Applications 获取相关的信息,building universal binaries for Mac OS X handling Visual Studio manifest files.

  • Building an Application 编译一个可执行程序
    • The app Template app模板
  • Building a Library 编译一个库
    • The lib Template 库模板
  • Building a Plugin 编译一个插件
    • Building a Qt Designer Plugin 编译一个Qt Designer使用的插件
  • Building and Installing in Debug and Release Modes 调试模式和发布模式的编译和安装
    • Building in Both Modes 以上两种模式的编译
    • Installing in Both Modes 以上两种模式的安装

编译一个可执行程序

app模板

app模板告诉qmake生成的Makefile是将要编译一个可执行程序,使用这个模板,应用程序的类型可以添加下面的选项到CONFIG变量中

选项

描述

windows

程序是Window平台的界面程序

console

App模板专用: 程序是Window平台控制台程序

当你使用这个模板,以下的一些qmake变量是能用的,你可以在pro文件使用这些变量来配置你的应用程序需要的相关的信息

  • HEADERS –程序中需要编译的头文件列表.
  • SOURCES -程序中需要编译的源文件列表.
  • FORMS – Qt Designer为程序创建的ui文件列表(qte2INTERFACES).
  • LEXSOURCES – 程序用到的所有的lex 源文件列表.
  • YACCSOURCES -程序用到的所有的yacc 源文件列表.
  • TARGET –可执行程序的名字.默认是跟工程文件名一样 (根据不同的平台后缀名会自动添加).
  • DESTDIR –可执行文件的发布目录.
  • DEFINES – 程序编译时候需要的预定义的列表
  • INCLUDEPATH –程序需要的头文件的目录列表.
  • DEPENDPATH –程序搜索的依赖路径.
  • VPATH – 查找supplied 文件的搜索路径(我还没有弄懂~_~).
  • DEF_FILE – Windows 平台专用: 程序需要用到的.def .
  • RC_FILE - Windows 平台专用: 程序的资源文件.
  • RES_FILE - Windows 平台专用: 程序需要连接的资源文件.

你只需要使用已经设置了值的系统变量,例如,如果你没有任何额外的头文件路径 INCLUDEPATH就不用在设置什么了,qmake会自动加入qt自身需要的默认的路径,例如一个pro文件的例子可能是下面的样子

TEMPLATE = app

DESTDIR = c:/helloapp

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

DEFINES += QT_DLL

CONFIG += qt warn_on release

如果条目是单独的值,如模板或者发布目录,我们使用=,但书如果条目是多值的,我们就使用+= 来添加该类型需要添加的东西,= 来使用条目新值比如 我们使用了DEFINES=QT_DLL,所有其他的预定义就会被删除

相关文章:

  • 《码农经验手册》-拿到需求写代码前,要思考的问题有哪些?
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之9---移动增值业务产业链...
  • 《码农经验手册》-新手和老司机
  • Azure 聊天机器人-1 环境搭建
  • Azure 聊天机器人2
  • 通过Socket configuration controls 获取网络设备地址
  • vim amp; emacs color Scheme
  • Azure 聊天机器人3-集成luis(语言识别)服务
  • Azure聊天机器人4-实现luis dialog
  • Oprofile工具的使用
  • C# 自然语言处理1-识别文字到语音
  • 在wxPython中使用OpenGL
  • C#自然语言处理2-识别语音并执行进程
  • Winforms:只读TextBox的文字颜色不随ForeColor的改变而改变
  • c# OpenCV -1 直接比对两张图片
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [数据结构]链表的实现在PHP中
  • android图片蒙层
  • github从入门到放弃(1)
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java多线程(4):使用线程池执行定时任务
  • leetcode-27. Remove Element
  • Python爬虫--- 1.3 BS4库的解析器
  • SAP云平台里Global Account和Sub Account的关系
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • ucore操作系统实验笔记 - 重新理解中断
  • Web标准制定过程
  • 初识 webpack
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 搞机器学习要哪些技能
  • 官方解决所有 npm 全局安装权限问题
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 解决iview多表头动态更改列元素发生的错误
  • 前言-如何学习区块链
  • 通过npm或yarn自动生成vue组件
  • 学习笔记:对象,原型和继承(1)
  • 栈实现走出迷宫(C++)
  • 做一名精致的JavaScripter 01:JavaScript简介
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Android开发者必备:推荐一款助力开发的开源APP
  • Prometheus VS InfluxDB
  • ​什么是bug?bug的源头在哪里?
  • # Panda3d 碰撞检测系统介绍
  • # 透过事物看本质的能力怎么培养?
  • #、%和$符号在OGNL表达式中经常出现
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • ()、[]、{}、(())、[[]]命令替换
  • (0)Nginx 功能特性
  • (C++20) consteval立即函数
  • (Java数据结构)ArrayList
  • (待修改)PyG安装步骤
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)Linux下编译安装log4cxx
  • .NET CLR基本术语