Qt5.9.1 qmake 中文手册(二)

xiaoxiao2021-02-28  97

   

快速入门

本教程会介绍有关qmake的基础知识,和使用qmake的详细信息。

开始简单实例

假设我们已经完成了一个应用程序的基本配置,并且创建了以下文件:

hello.cpphello.hmain.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并且当debugdebug已经添加到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编译生成应用程序libMakefile编译生成一个库。auxMakefile不编译生成任何东西, 不需要编译器生成目标文件,比如项目是用解释型语言编写的。

说明: 此模板只适用于基于makefiles的生成器,不支持vcxproj和Xcode生成器。

subdirsMakefile包含指定的子目录的规则,子目录通过指定SUBDIRS变量来实现。每一个子目录都包含自己的项目文件。vcappVisual Studio应用程序项目。vclibVisual Studio库项目vcsubdirsVisual 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
转载请注明原文地址: https://www.6miu.com/read-66175.html

最新回复(0)