Qt5.9.1 qmake 中文手册(二)
2017-09-01 10:10
190 查看
快速入门
本教程会介绍有关qmake的基础知识,和使用qmake的详细信息。开始简单实例
假设我们已经完成了一个应用程序的基本配置,并且创建了以下文件:hello.cpp
hello.h
main.cpp
这些文件存在于
examples/qmake/tutorial文件夹中。你需要知道的另一件事情就是应用程序是由Qt编写的。首先,使用你最喜欢的文本编辑器,新建一个文件名字叫
hello.pro的文件在
examples/qmake/tutorial文件夹中。 接下来你需要添加内容告诉qmake那些头文件和源文件是你项目的一部分。
我们会首先添加源文件,这时候你就需要用到SOURCES这个变量。写下这样的一行
SOURCES +=后边加上hello.cpp。类似如下这样:
SOURCES += hello.cpp
一直重复添加到最后一个源文件:
SOURCES += hello.cpp SOURCES += main.cpp
如果你喜欢使用make一样的语法,列出所有的文件并且用换行符取拼接它们,如下所示:
SOURCES = hello.cpp \ main.cpp
这样源文件就被写在工程文件里面了,同样的头文件一样需要被添加进来。和源文件一样的添加方法,使用变量HEADERS.
添加完成后,你的项目文件就是如下类似的样子:
HEADERS += hello.h SOURCES += hello.cpp SOURCES += main.cpp
生成目标文件的名字是自动生成的。和这个项目的名称相同, 但是生成的目标文件的后缀是和平台相关的.比如, 项目的名称是
hello.pro,在Windows平台下生成的目标文件就是
hello.exe,在linux下生成的就是
hello。如果你需要设置目标文件和项目是不同的名字,你可以这样设置:
TARGET = helloworld
项目文件编辑完成后是这个样子:
HEADERS += hello.h SOURCES += hello.cpp SOURCES += main.cpp
你可以在命令行下使用qmake为项目生成生成Makefile,在项目的根目录下,执行如下命令:
qmake -o Makefile hello.pro
然后
make或者
nmake命令来编译项目。
对于Visual Studio用户,qmake可以生成Visual Studio的项目文件s.例如:
qmake -tp vc hello.pro
创建可调试的应用程序
release版本的应用程序不包含调试符号表和其他调试信息,在开发的过程中,创建一个debug版本的应用程序是非常有用的。在Qt项目中,添加debug版本的程序非常简单,通过添加debug到变量CONFIG中就可以。
For example:
CONFIG += debug HEADERS += hello.h SOURCES += hello.cpp SOURCES += main.cpp
像上面一样生成新的Makefiles,你就会在运行过程中获得程序中有用的调试信息。
添加特定平台的源文件
一段时间的练习,也许会需要平台相关的代码。并对不同平台的代码分开处理。你现在有两个文件包含到你的项目中:hellowin.cpp和
hellounix.cpp。我们不能单独这样把它们添加到
SOURCES中,这样会把两个文件度写入Makefile中。所以,我们需要区分我们需要为那个平台构建程序。
为windows添加平台相关的文件是这样的:
win32 { SOURCES += hellowin.cpp }
当qmake在windows平台运行的时候会添加
hellowin.cpp到项目中。当为其他平台编译的时候,qmake会忽略这个文件。接下来我们为unix平台添加平台相关文件.
完成以上步骤后,项目文件变成下面的样子:
CONFIG += debug HEADERS += hello.h SOURCES += hello.cpp SOURCES += main.cpp win32 { SOURCES += hellowin.cpp } unix { SOURCES += hellounix.cpp }
还是像上面那样生成Makefiles。
如果缺少某个文件停止继续执行qmake
你一定不希望你创建的Makefiles所需要的文件是不存在的,这种情况下,我们可以使用exists()这个内置函数来判断。可以通过error()这个内置函数使qmake停止构建项目。例子如下!exists( main.cpp ) { error( "No main.cpp file found" ) }
符号
!是取反得到意思,和C++一样,如果main.cpp存在,
exists( main.cpp )返回true,如果main.cpp不存在,
!exists( main.cpp )返回true。
CONFIG += 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" ) }
U按照之前的方法重新生成Makefiles,如果你对
main.cpp重命名后,你就会得到上面代码里返回的错误信息,qmake会停止继续构建项目并立即返回。
检查多个条件
假如你使用的平台是windows同时你希望实时看到qDebug()的输出,当你在命令行下运行你的程序的时候,要想看到这些输出,你必须在编译你程序的时候进行适当的控制台设置。我们可以简单的把
console加到
CONFIG并且当变量中的时候,这时候就需要两个相互嵌套的条件了。首先创建一段条件代码,用花括号限定条件范围,然后在第一个条件范围内再增加第二个条件,如下:[/code]debugdebug已经添加到[code]CONFIG
win32 { debug { CONFIG += console } }
嵌套的条件可以用冒号链接到一起,那么最终的项目文件就是如下的样子:
CONFIG += 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的教程, 你可以试着为你自己的项目编写一个项目文件并且测试了。下面是一个简单的例子作为参考:
#------------------------------------------------- # # Project created by QtCreator xxxx-xx-xx # #------------------------------------------------- QT += core gui network serialport concurrent greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = example TEMPLATE = app DEFINES += QT_DEPRECATED_WARNINGS TRANSLATIONS+=\ translate/example_EN.ts win32 { #------------------------------------------------- # Windows Host x86 #------------------------------------------------- contains(QMAKE_TARGET.arch,x86){ INCLUDEPATH += C:/example_3rdlib/x86/include LIBS +=-LC:/example_3rdlib/x86/lib/ win32:CONFIG(release, debug|release){ LIBS +=-lexample_3rdlib } else:win32:CONFIG(debug, debug|release){ LIBS +=-lexample_3rdlibd } } #------------------------------------------------- # Windows Host x64 #------------------------------------------------- contains(QMAKE_TARGET.arch,x86_64){ INCLUDEPATH +=C:/example_3rdlib/x64/include LIBS +=-LC:/example_3rdlib/x64/lib/ win32:CONFIG(release, debug|release){ LIBS +=-lexample_3rdlib } else:win32:CONFIG(debug, debug|release){ LIBS +=-lexample_3rdlibd } } } #------------------------------------------------- # Linux Host #------------------------------------------------- unix { INCLUDEPATH +=/path/include LIBS += -L/path/lib/ -lexample_3rdlib } SOURCES += main.cpp\ example.cpp HEADERS +=example.h RESOURCES += \ example.qrc FORMS += \ example.ui RC_FILE += \ example.rc
创建项目文件
目录
项目文件元素变量
注释
内置函数和控制流
项目模板
常规配置
Qt库声明
配置功能
声明其他库
创建项目文件
Qt项目文件(.pro)包含了qmake构建应用程序,库和插件需要的所有信息。通常,在一些需要使用特定资源的项目中,可以使用简单的编程结构来描述不同的编译平台,不同的构建过程,不同的环境变量。项目文件元素
使用qmake的Qt项目文件(.pro)可以支持简单或者是复杂的构建系统。简单的项目文件(.pro)使用简单直接的声明样式,定义标准变量来指示项目中使用的头文件和源文件。复杂的项目可以使用控制流结构来调整构建过程。以下部分详细描述了项目文件(.pro)使用的不同类型的元素。
变量
在项目文件(.pro)中,变量是用来存储字符串的列表。在简单的项目中,这些变量告知qmake要使用的配置选项,或者提供在构建过程中使用的文件名和路径。qmake会搜索每个项目文件中包含的变量,并利用这些变量来决定什么内容应该被写入Makefile文件中。比如,HEADERS and SOURCES 变量会把项目包含的头文件和源文件列表告知给qmake,头文件和源文件的路径是相对于项目文件(.pro)所在的目录。
变量还可以用来存储内部临时列表值,现有的列表值可以扩展和覆盖。
下面的片段说明了如何把列表的值赋值给变量:
HEADERS = mainwindow.h paintwidget.h
变量的列表值可以用以下的方法扩展:
SOURCES = main.cpp mainwindow.cpp \ paintwidget.cpp CONFIG += console
说明: 上面的两个例子中,第一个例子中,
HEADERS变量包含了与
HEADERS变量同一行的内容。第二个例子中通过一个反斜杠(\)拼接了
SOURCES变量的内容。
The CONFIG变量是另一个qmake需要的特殊变量来生成Makefiles,它的详细介绍在常规配置中。在上面的代码中,
console会被添加到
CONFIG的列表值中。
下面的列表给出了常用的变量及其具体描述,关于完整的变量的描述请参考变量。
变量 | 描述 |
---|---|
CONFIG | 常规项目的配置选项 |
DESTDIR | 编译生成的可执行文件或二进制文件存放的文件夹。 |
FORMS | 用户界面文件(后缀为.ui文件)的列表,这些文件会被用户界面编译器(uic)编译处理。 |
HEADERS | 编译项目所需要的头文件(.h)的列表。 |
QT | 项目中使用的Qt模块的列表。 |
RESOURCES | 项目包含的资源文件(.qrc)的列表,参考Qt 资源系统获取资源文件的更多信息。 |
SOURCES | 编译项目所需要的源文件的列表。 |
TEMPLATE | 项目的模板,模板的选择决定项目编译输出的是一个应用程序,或者一个库,或者是一个插件。 |
$$放在变量名称之前来获取变量的内容。这种方法可以使一个变量的值赋值给另一个变量:
TEMP_SOURCES = $$SOURCES
操作符
$$和内置函数被广泛的使用在处理字符串和列表的值,更多信息请参考qmake语法。
空格
通常情况下,空格用来在变量赋值的过程中分割内容,如果指定的内容包含空格,你必须附上双引号包含这些内容:DEST = "Program Files"
双引号里面包含的内容会被视为变量值的列表中的一个元素,类似的方法可以被用来处理带空格的路径, 特别是当我们为windows平台定义INCLUDEPATH和LIBS变量的时候:
win32:INCLUDEPATH += "C:/mylibs/extra headers" unix:INCLUDEPATH += "/home/user/extra headers"
注释
你可以为项目文件添加注释,注释以#开始直到行结束,例如:
# usually start at the beginning of a line, but they # can also follow other content on the same line.
如果你想要包含带有
#字符变量赋值, 就需要使用内置的LITERAL_HASH变量。
内置函数和控制流
qmake提供了许多内置函数来处理变量的内容,在一些常规项目中最常使用的内置函数就是include(),这个函数以文件名为参数,这个给定的文件将被包含到项目文件中include被使用的地方,
include函数常用于一个项目文件包含另一个其他的项目文件的情况:
include(other.pro)
Qt通过scopes支持条件结构体,类似与
if语句:
win32 { SOURCES += paintwidget_win.cpp }
在花括号内部的赋值只有在上面的条件成立的时候才会生效,在这种情况下, 必须把
win32设置到CONFIG变量中去,在windows平台下win32会自动被设置到CONFIG变量中,一对花括号的开括号必须与判断条件在同一行。
更复杂的操作需要循环调用内置函数实现,比如find(), unique(),和count()。 这些函数和其他提供操作字符串和路径的工具,支持用户输入和调用外部命令的功能。更多参考qmake 语法. 详细函数介绍参考替换函数 and测试函数.
项目模板
项目目标TEMPLATE变量被用来定义编译项目类型的。如果没有指定,qmake会默认编译为应用程序类型。下面的列表总结了qmake支持的项目类型模板和描述了不同类型模板下生成的文件类型。
项目模板 | qmake输出 |
---|---|
app (default) | Makefile编译生成应用程序 |
lib | Makefile编译生成一个库。 |
aux | Makefile不编译生成任何东西, 不需要编译器生成目标文件,比如项目是用解释型语言编写的。 说明: 此模板只适用于基于makefiles的生成器,不支持vcxproj和Xcode生成器。 |
subdirs | Makefile包含指定的子目录的规则,子目录通过指定SUBDIRS变量来实现。每一个子目录都包含自己的项目文件。 |
vcapp | Visual Studio应用程序项目。 |
vclib | Visual Studio库项目 |
vcsubdirs | Visual Studio多项目解决方案。 |
app和库
lib模板项目的编写建议。
当项目中配置了
subdirs, qmake生成的Makefiles会检查每一个子目录, 处理所有能找到的项目文件, 执行平台的构建命令
make,
SUBDIRS变量被用来包含所有要被处理的子目录的列表。
常规配置
CONFIG变量指定了项目配置的选项和功能。项目可以被编译成release模式或者debug模式, 或者全部。如果同时指定了debug和release,最后指定的选项会生效,如果指定了
debug_and_release选项为项目编译debug和release两种版本 qmake生成的Makefile包含了编译两种模式的编译规则,可以用下面的方法调用:
make all
添加
build_allCONFIG变量中,在构建项目中设置为默认编译选项。
说明: 每一个在
CONFIG变量中指定的选项可以同样被用于条件选项。 你可以使用内置函数CONFIG()测试某些配置选项是否存在,例如the 下面代码测试了是否
opengl被配置使用了:
CONFIG(opengl) { message(Building with OpenGL support.) } else { message(OpenGL support is not available.) }
Qt允许在构建
release和
debug版本时候使用不同的配置选项。更过信息请参考Using Scopes.
下面定义的项目选项蒋被构建到项目中去
说明: 其中欧谢选项只会在相关的平台上才会生效。
选项 | 描述 |
---|---|
qt | 这是一个Qt应用程序,必须链接Qt库文件。你可以使用QT变量控制程序额外需要的任何一个的qt的库。这个值是默认添加的,但是你可以通过使用qmake去除它,变成一个不适用qt库的应用程序。 |
x11 | 这是一个X11的应用程序或库文件。如果使用Qt的情况下,这个值是不必要的。. |
比如,你的项目使用了Qt库,并且你想构建这个项目的
debug模式,那么你的项目文件应该包含如下片段。
CONFIG += qt debug
说明: 你必须使用"+=",而不是"=", 否则qmake将不能通过Qt的配置确定项目所需要的设置。
声明Qt库
如果CONFIG变量中包含qt这个值,qmake将支持Qt应用程序的编译。这样会使得你灵活调整你项目程序中使用的Qt模块。这是通过QT变量实现对外部模块的声明。比如:我们通过下面的方法实现添加network和xml模块的添加:
QT += network xml
说明:
QT默认包含
core和
gui模块,所以以上的片段添加了network和XML模块到默认的列表中。下面的赋值省略默认的模块, 当编译的时候会发生错误。
QT = network xml # This will omit the core and gui modules.
如果你想编译你的程序不使用
gui模块,你需要添加"-="操作符:在默认情况下,
QT同时包含了
core和
gui,那么下面的代码将会生成一个不包含gui的项目:
QT -= gui # Only the core module is used.
关于
QT变量可添加的Qt的模块列表详情,参考QT.
配置功能
qmake可以设置额外的配置选项,这些配置选项是在(.prf)文件中定义的。这些额外的配置选项,通常是为了支持在构建过程中使用自定义的工具。为构建过程添加一个特性, 将特性的名字(特性文件的猪名)添加到CONFIG变量中。
例如,qmake可以通过配置项目使用pkg-config支持的外部库,比如D-Bus和ogg库等。 如下所示:
CONFIG += link_pkgconfig PKGCONFIG += ogg dbus-1
关于更多使用和添加特性的内容,请参考添加配置特性.
声明其他库
如果你在项目中使用其他的非qt提供的库,你需要在你的项目文件中指定它们。qmake库搜索路径和指定库的链接可以通过LIBS变量添加。你可以指定库搜索路径或者使用Unix风格的标记法指定库的搜索路径和库。
下面的例子显示了如何指定第三方库:
LIBS += -L/usr/local/lib -lmath
包含头文件的路径也可以用类似的方式指定INCLUDEPATH变量的内容。
例如添加头文件搜索路径:
INCLUDEPATH = c:/msdev/include d:/stl/include
相关文章推荐
- Qt5.9.1 qmake中文手册(一)
- Qt 5.9.1 参考手册 QtTest 第2章 数据驱动测试
- Qt5 qmake TARGET 设置中文
- Qt 3.0.5 qmake用户手册
- Qt 5.9.1 参考手册 QtTest 第5章 写一个基准线
- The process "E:\Qt\4.8.5\bin\qmake.exe" exited with code 2.(不能包含中文路径,qmake够弱智的)
- qmake手册(Qt5.9.3)
- Qt中文手册 之 QHeaderView
- [教程]解决ubuntu16.04下Qt5.9.1无法输入中文
- Qt中文手册 之 QApplication
- Qt中文手册 之 QTableWidget
- Qt中文手册 之 QTreeWidget
- Qt中文路径问题(Cannot find file: 进程"C:\Qt\4.8.5\bin\qmake.exe"退出,退出代码 2)
- Qt解读之qmake手册
- Qt中文手册 之 QTreeWidgetItem
- Qt 5.9.1 参考手册 QtTest 第3章 模拟GUI事件
- Qt 5.9.1 参考手册 QtTest 第4章 回放GUI事件
- Qt中文手册 之 QApplication
- Qt 5.9.1 参考手册 QtTest 第1章 写一个单元测试
- phpGACL中文手册(四)