大家好,又见面了,我是你们的朋友全栈君。
qmake可以帮助我们在跨平台构建应用程序的时候变得更简单,我们可以通过写简单的几行必要的信息来生成构建文件,我们可以在任何的软件项目中使用qmake
qmake基于pro文件生产构建文件,pro文件是由开发者创造的,它的用法也很方便,但是越复杂的应用程序,需要的pro文件越复杂
qmake的包含一些附加特性来支持Qt的开发,他将会自动的包含对于moc和uic的规则
qmake同样也可以在开发者不更改pro文件的时候生成VisualStudio的项目文件
简单介绍下qmake
简要介绍
qmak工具是一个面向项目的系统,可以帮助应用程序,库,或者其他的组件的的构建,这一特性让你对应用程序的控制不仅局限于包含文件,构建过程中的每一步都可以被描述。而且这一过程都在编辑一个文件来实现,qmake将每一个项目文件中的信息展开成一个Makefile,这一步是在编译和连接过程中必须的
关于pro文件
项目是pro文件所描述的,qmake使用这个文件中的信息来构建每一个项目,项目文件主要包含源文件和头文件的引用,生成配置信息,还有其他任何的应用程序指定的细节,比如引用额外的库来链接,或者其他的include路径
pro文件包含很多不同的信息,包括注释,变量声明,内置函数,还有一些简单的控制结构,在最简单的pro文件中,仅仅声明了头文件和源文件,还有一些基本的配置选项,更多的细节请看:如何创造一个简单的pro文件
对于更复杂的项目,你可以创造更复杂的项目文件,关于pro文件的介绍,可以看一下如何创造项目文件一节,更多的关于pro文件的信息,可以看下参考
你可以使用应用或者库模板来指定构建配置选项进而确定构建构成,更多的信息,可以看构建常规的项目类型这一节
你可以使用Qt Create new project wizard命令来创造一个pro文件,你选择项目模板后,Qt Creater将会创造一个默认的pro文件来让你可以构建和运行项目,你可以修改pro文件来设置你的目标
你也可以使用qmake来生成pro文件,更多的信息请看Running qmake
这些基础的配置特性可以生成跨平台的项目,然而一定是有用的,详细的请看Platform Notes
构建一个项目
对于简单的项目,你只需要运行顶层文件件夹中的qmake来生成makefile,你可以运行你的平台构建构工具通过makefile来构建项目
使用第三方库
Thrid Party Libraries显示了如何使用简单的构建第三方库
预编译头文件
在大型的项目中,你可以设置预编译头文件来提高项目的编译速度,详细的请看 Using Precompiled Headers
让我们开始试试吧
这个教程将叫你qmake的基础,下面的几个子章节将简单介绍下qmake的用法
从一个简单的例子开始
我们假定你已经完成了应用程序的基本实现,假定你已经创造了如下的文件
- hello.cpp
- hello.h
- hello.cpp
现在唯一要做的就是在qt中写下如何设置应用程序,首先,使用你喜欢的编辑器,创造一个名为hello.pro的文件,下面需要做的就是在这个文件中添加上一些命令,来告诉qmake关于源文件和头文件是你开发的项目中的一部分
所以我们首先在pro文件中添加源文件的信息,你需要使用SOURCES变量,新开一行,然后写上SOURCES += 然后写上hello.cpp
SOURCES += \
hello.cpp \
main.cpp
HEADERS += \
hello.h
目标名将会自动设置,默认情况下和项目名称相同,但是其后缀要是和现在的平台,举个例子,如果pro文件名为hello.pro,目标文件在windows上将会是hello.exe,然后再Unix上将是hello。如果你设置一个不同的名字,你可以这样设置
TARGET = helloword
现在你可以使用qmake来生成你应用的Makefile,在你的pro文件中,你可以写下
qmake -o Makefile hello.pro
//但是我现在不知道qmake放在前面是什么意思,这样会导致遍历pro文件时无法通过
允许程序可以Debug
一般来讲Release版本的应用程序不包含debug的语法或者其他的debug的信息,但是在应用的开发阶段,在应用程序中包含可以debug的信息是很有必要的,在qt中可以通过添加debug信息来允许应用程序可以debug
比如:
CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
然后像之前一样使用qmake来生成makefile,这样的话,你将会在程序运行过程中得到有用的debug信息
添加特定平台的源文件
在程序开始开发后,你可能开始需要针对不同的平台开发应用程序,这时候你可能需要分离代码,这样你将会有两个新的文件在你的pro文件中,一个是 hellowin.cpp,一个是hellounix.cpp,但是再Qt中你可以在pro中通过设置选择需要添加哪些额外的文件,比如这样:
win32 {
SOURCES += hello.cpp
}
当为windows开发应用程序的时候,添加hellowin.cpp来源文件中,当构建其他平台的应用程序的时候,qmake将会忽视他们,比如这样
CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
win32 {
SOURCES += hellowin.cpp
}
unix {
SOURCES += hellounix.cpp
}
设置当文件不存在的时候就停止qmake
你可能会想如果某个文件不存在的时候就停止生成makefile,我们可以使用exit()函数来检查某个文件是否存在,我们可以使用函数error()来停止qmake构建,这个和作用域的功能相同,比如这样:
!exists( main.cpp ) {
error( "No main.cpp file found" )
}
好了,现在你的pro文件看起来像这样
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" )
}
检查多个条件
如果你在使用windows的话,当你在命令行模式使用应用程序的时候,相通过使用函数qDebug()来输出你想要的状态,你一定使用适当的控制台设置来构建你的应用,我们可以方便的在CONFIG中添加console命令,这样的话就会在在makefile的时候,包含相关的命令,假设当我们仅在window模式下,并且只在debug的模式下来应用此功能,需要这样做
win32 {
debug {
CONFIG += console
}
}
这时候你的pro文件看起来是这个样子
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
}
创建项目文件
pro文件包含所有的qmake用来构建应用程序的信息,这包括了库,插件,货真你使用的一系列的声明的源文件,不过要想让同一个程序跨平台,就需要包含不同的描述平台的文件
pro文件基础
qmake使用的pro文件可以用来构建简单或者复杂的系统,简单的pro文件可以用直接的声明方法,定义标注的变量来声明项目使用的头文件和源文件;复杂的项目可能需要控制流式的架构来定义构建流程
下面的章节描述了了不同的项目文件的不同类型
变量
在项目文件中,变量通常是包含一串字符串,在最简单的项目中,这些变量告诉了qmake有关于配置的选项,或者一些在构建过程中的路径
qmake在每一个pro文件中寻找包含的变量,这些内容将决定应该向makefile中写入什么,举个例子,在HEADERS和SOURCES中的变量来告诉qmake关于头文件和源文件的信息。
变量也可以由内部使用来储存一些临时的列表,而且可以用新值来复写已经存在的值
下面的显示了如何为变量指定值
HEADERS = mainwindow.h paintwidget.h
然后变量中的值按照如下的方式来拓展
SOURCES = main.cpp mainwindow.cpp \
paintwidget.cpp
CONFIG += console
在其中 CONFIG 是一个特殊的变量,qmake用它来生成makefile,在之前的章节中讲过, console 是添加到现有的CONFIG变量中的
变量 | 描述 |
---|---|
CONFIG | 项目的基本配置选项 |
DESTDIR | 存放库文件和二进制文件的目录 |
FORMS | 所有使用过的UI文件 |
HEADERS | 头文件 |
QT | 使用的QT的模块 |
RESOURCES | 所有的资源文件 |
SOURCES | 所有的源文件 |
TEMPLATE | 项目的模板,声明了应用程序是一个应用,还是一个库,或者一个插件 |
变量的内容可以通过在前面加一个$$来读取,这样就可以使用一个变量来赋值给另外一个变量了
比如
TEMP_SOURCES = $$SOURCES
$$操作符是一个很常用的用来操作字符串或者值得内置函数
关于空白
通常来讲,空白分割了变量的值,如果指定的变量中包含空格,那就需要在外面加上双引号,比如:
DEST = "Program Files"
下面描述了两个包含空格的实例
win32:INCLUDEPATH += "C:/mylibs/extra headers"
unix:INCLUDEPATH += "/home/user/extra headers"
关于注释
使用#
# Comments usually start at the beginning of a line, but they
# can also follow other content on the same line.
内置函数和控制流
qmake提供了一系列的内资函数,来使用变量所处理的内容,最普通的情况下使使用include()函数,然后再里面包含一个文件名来作为一个内容,这些给定文件的内容会包含在本文件中,比如:
include(other.pro)
对条件结构的支持是使用{}来实现的,类似于if语句
win32 {
SOURCES += paintwidget_win.cpp
}
{}内部的语句只有在条件满足的时候才只能,win32 CONFIG选项如果在WIndows平台编程的时候一定会自动的加上
还有更复杂的内置函数,比如find(),unique(),count,这些函数目的都是方便我们操作字符串和变量,来支持用户输入,或者调用其他的工具,更多的信息请看qmake language
项目模板
TEMPLATE 变量用来定义项目将要构建的类型,如果没有在项目文件中声明,qmake将默认生成Application,并由此生成一个makefile的作为目的
下面的是可用模板类型
模板 | qmake输出 |
---|---|
app(默认) | 生成一个应用 |
lib | 生成一个库 |
aux | 不构建任何东西,当我们没有编译器的时候,或者解释语言的时候使用这个选项 |
subdirs | MakeFile包含由SUBDIRS指定的规则,每一个子目录都包含它自己的pro文件 |
vcapp | 构建VisualStudio项目文件 |
vclib | 构建lib |
vcsubdirs | 构建VisualStudio的subdirs |
在写app和lib的时候可以参考 Buliding Common Project Types
当使用 subdir 模板的时候,qmake生成一个MakeFile的时候要搜索所有的子文件夹,并执行路径下的每一个pro文件,并且运行平台的 make工具在新创建的Makefile上,SUBDIRS变量用来包含一系列的子目录
常规配置属性
变量 CONFIG 指定了项目所需要的配置的选项和特征
项目可以在release模式或者debug模式下运行,或者两个模式都运行,如果debug和release模式都狮子那个了,那么生效的将会是最后一个,如果你指定了 dubug_and_release选项来构建项目的debug和release版本,qmake所生成的Makefile将包含一个语句用来生成所有的版本,如下:
make all
在CONFIG选项中添加build_all选项来指定在构建的时候生成两个版本的程序
注意:在CONFIG下的每一个选项都需要包括在花括号中,你可以使用函数CONFIG()来判断是否opengl选项正在使用,如下:
CONFIG(opengl) {
message(Building with OpenGL support.)
} else {
message(OpenGL support is not available.)
}
如果要在debug和release选项中使能不同的配置选项,可以使用release和dubug花括号,更多的信息可以查看 Using Scopes
下面的选项定义了项目的构建的类型
注意:一些设置只有在使用相关的平台的时候才起作用
选项 | 描述 |
---|---|
qt | 此项目是Qt应用程序,应该将此应用程序连接到Qt的库中,你可以根据你的实际应用程序使用QT的的变量来控制任何附加的Qt模块,此值是默认添加的,但是你可以在不创建Qt应用程序的时候在qmake中删掉 |
x11 | 本项目是一个 C++ X11 的应用程序后者库,这个变量在使用Qt的时候不是必须的 |
应用程序和库模板 可以提供给你更多特别的选项,目的是使应用程序的构建更好,这些选项在下面的章节中将展示
举个例子,如果你的应用程序使用Qt库,并且你想在debug模式下构建,你的pro文件需要包含
CONFIG += qt debug
声明Qt的库
如果CONFIG变量包含qt这个值,qmake将会支持Qt应用程序,这样的话就可以使用以下的格式来声明Qt中带的库
QT += network xml
注意:
默认情况下,QT 会包含core 和gui模块,所以不能使用=来添加还需要使用的模块,而应该使用+=
如果不想使用gui模块,需要使用 -= 符号,如下所示:
QT -= gui
详细的关于Qt模块的列表,请看QT
配置特性
qmake可以使用额外的配置特性,需要卸载prf文件中,这些额外的属性通常是来支持在构建过程中使用的定制的工具,为了在构建过程中添加这些特性,使用变量CONFIG来添加特征的名字
比如,qmake可以配置构建阶段,使其可以利用额外的库,需要使用pkgconfig的支持,比如D-bus和ogg库,如下:
CONFIG += link_pkgconfig
PKGCONFIG += ogg dbus-1
详细的可以看下面的章节
声明其他的库
如果你需要在你的项目中添加其他的库,你需要在你的pro文件中指定
你可以使用unix风格的,命令行来声明其他的库,比如
LIBS += -L/usr/local/lib -lmath
需要需要添加额外的头文件的话,可以使用INCLUDEPATH变量,比如:
INCLUDEPATH = c:/msdev/include d:/stl/include
让我们开始创建一个普通的项目吧
这一章主要描述如何来设置qmake项目文件,这三种常见的pro文件分别是 Qt::Application,Qt::library,Qt::plugin,我们会发现尽管项目的名称相同,但是通过设置不同的pro文件,我们最终可以得到不同的结果
Application的构建
app模板告诉qmake来生成一个用于构建一个application的Makefile,在这个模板的帮助下,application的类型,可以通过下面的配置文件来指定
Option | Description |
---|---|
windows | 使用GUI的应用程序 |
console | 使用控制台的应用程序 |
testcase | 应用程序是一个自动化测试 |
当使用这个模板的时候,下面的qmake变量是需要认识的,你可以在你的pro文件中来指定你的应用程序的信息,更多的跨平台的变量,可以看platform notes
- HEADERS – 应用程序的头文件列表
- SOURCES – C++源文件列表
- FORMS – 应用程序使用的UI文件
- LEXSOURCES – 应用程序使用的Lex源文件
- YACCSOURCES – 应用程序使用的Yacc源文件
- TARGET – 要生成的应用程序的名字,默认的名字是项目的文件名
- DESTDIR – 目标可执行文件所处的目录
- DEFINES – 在应用程序中所定义的任何附加的预处理器
- INCLUDEPAth – 应用程序中定义的任何附加的包含路径
- VPATH – 关于需要搜索的文件的路径
- DEF_FILE – 只有在windows平台中才可以使用,可以来反对应用程序的.def文件
如果你不需要加额外的配置,你可以不加,Qt会自己加上一些必要的选项,如下:
TEMPLATE = app
DESTDIR = c:/helloapp
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
DEFINES += USE_MY_STUFF
CONFIG += release
构建一个testcase
一个testcase项目是一个app项目,目的是来运行自动化的测试,任何app可能都需要进行一些测试用例,我们通过在CONFIG便令中添加testcase来实现
对于一个testcae项目,qmake将会在生成的Makefile文件中插入一个check目标,这个目标将会在应用中运行,如果这个测试没有达到预期的结果,将返回0
check目标自动的在SUBDIRS中递归的添加,这意味着在整个测试过程中,将会报出一个check命令
check目标的执行可以被具体的Makefile变量所定制,这些变量是
变量 | 描述 |
---|---|
TESTRUNNER | 这个命令将添加在每一个测试请求中,如果程序没有在规定时间内完成,将会报出超时的问题 |
TESTAGES | 这个命令将添加在每一个测试请求中,比如,这对通过附加的指令来设置测试的输出文件或格式(比如: -o filename, 这些选项有 QTestLib来阐述) |
构建一个库
lib模板告诉qmake来生成一个Makefile,此makefile将构建一个库,当时用此模板的时候,需要变量VERSION来支持,除了app模板所支持的系统变量,可以在pro文件中使用变量,来制定库的信息
当使用lib模板时,下面的选项需要添加在变量CONFIG中,让Qt知道需要生成什么类型的库
Option | Description |
---|---|
dll | 动态链接库 |
staticlib | 静态链接库 |
plugin | 插件 |
下面的选项同样可以在库中被定义
- VERSION – 目标库的版本,比如 2.3.1
构建一个插件
插件是需要lib模板支持的,如前面的章节所说,它告诉qmake来生成一个项目的makefile,用来对每一个平台构建一个插件,通常是用一个library的相识,和原生的库一样,VERSION变量同样也适用于插件
构建一个QtDesigner 插件
使用
QT += widgets designer
构建和安装在Debug和Release模式
有时候,有必要同时生成debug和release模式的文件,尽管CONFIG变量可以同时包括debug和release选项,但是只有最后一个指定的才生效
构建所有的模式
为了让项目可以同时构建所有的模式,你需要添加CONFIG中 debug_and_release选项:
CONFIG += debug_and_release
CONFIG(debug, debug|release) {
TARGET = debug_binary
} else {
TARGET = release_binary
}
花括号里面的内容的目的是为了确保结果的目标文件有不同的名字,这样做的目的是为了让两个名字不相互覆盖
让qmake构建项目文件的时候,它将会生成一个makefile的规则,这个规则允许项目构建所有的模式,可以通过如下的命令来调用
make all
在所有的模式下安装
运行qmake
qmake的特性在有很多不同变量的选项下的时候可以被定制,他们允许构建过程可以被优化,提供有用的诊断信息,并且可以被用于指定项目的目标平台
请求语法
下面的语法来执行qmake
qmake [mode] [options] files
操作模式
qmake支持两个不同的操作模式,在默认的模式下,qmake使用pro文件中的信息来生成一个makefile,但是它同样有可能使用qmake来生成pro文件,如果你想来显示的设置这个模式,你一定在所有其他的选项中定义它,mode可以是下面的两个值
- makefile – qmake输出一个makefile
- project – qmake输出
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144421.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...