一、属性 qmake 有一个持久化配置系统,它允许在 qmake 中设置一次属性,并在每次调用 qmake 时查询它。 可以在 qmake 中设置一个属性: qmake -set PROPERTY VALUE 您可以从 qmake 检索此信息,如下所示: qmake -query PROPERTY qmake -query //列出内置属性 以下是内置属性: QMAKE_SPEC:在主机构建期间解析并存储在 QMAKESPEC 变量中的主机 mkspec 的短名称 QMAKE_VERSION:qmake QMAKESPEC 环境变量可以包含以下内容: 包含 qmake.conf 文件的目录的完整路径。在这种情况下,qmake 将从该目录中打开 qmake.conf 文件。 QMAKE_EXT_H:使 qmake 将所有带有这些后缀的文件解释为 C 和 C++ 头文件。
英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5/qmake-overview.html 由于qmake manual和overview 两章的内容都不多就把它们放在一起翻译了出来 qmake 指南 qmake 是帮助简化跨平台项目开发的构建过程的工具,qmake能自动生成Makefile Building Common Project Types Running qmake Platform Notes qmake Language Advanced Usage Using Precompiled 你也可以用qmake生成项目文件。更全面的qmake命令行参数描述,请参阅 Running qmake。 qmake的基本配置功能可以处理大多数的跨平台项目。 在配置构建过程时qmake使用的相关环境变量的详细信息,请查看 Configuring qmake.
记录QMake宏定义的使用。 += DEBUG 使用: #ifdef DEBUG qDebug() << ">Debug<"; #endif // output: >Debug< 定义宏值(带双引号字符): # QMAKE_COPY => cp DEFINES += "COPY_CMD_LINE=\"\\\"$$QMAKE_COPY\\\"\"" 使用: qDebug() << COPY_CMD_LINE; // output
操作模式 qmake可以帮助我们在跨平台构建应用程序的时候变得更简单,我们可以通过写简单的几行必要的信息来生成构建文件,我们可以在任何的软件项目中使用qmake qmake基于pro文件生产构建文件 ,pro文件是由开发者创造的,它的用法也很方便,但是越复杂的应用程序,需要的pro文件越复杂 qmake的包含一些附加特性来支持Qt的开发,他将会自动的包含对于moc和uic的规则 qmake同样也可以在开发者不更改 ,你可以设置预编译头文件来提高项目的编译速度,详细的请看 Using Precompiled Headers 让我们开始试试吧 这个教程将叫你qmake的基础,下面的几个子章节将简单介绍下qmake的用法 如果你设置一个不同的名字,你可以这样设置 TARGET = helloword 现在你可以使用qmake来生成你应用的Makefile,在你的pro文件中,你可以写下 qmake -o Makefile ,他们允许构建过程可以被优化,提供有用的诊断信息,并且可以被用于指定项目的目标平台 请求语法 下面的语法来执行qmake qmake [mode] [options] files 操作模式 qmake支持两个不同的操作模式
罗列了一些Qt君常用到的qmake隐藏变量,因为这些变量没有写入到Qt官方的qmake文档中,意味着后续版本中说不能用就不能用了,只是做参考用。 下列的这些qmake隐藏变量都能在Qt5.12.2版本中使用。 unix是斜杠/ QMAKE_QMAKE qmake执行文件的绝对路径 *.pro项目文件,在Qt 5.12.2看到已是公开变量 一些跨平台命令 变量 含义 命令对照(win平台) QMAKE_CHK_DIR_EXISTS 检查目录是否存在的命令 if not exist QMAKE_COPY 复制文件命令 copy /y QMAKE_COPY_FILE 复制文件命令 copy /y QMAKE_COPY_DIR 复制目录命令 xcopy /s /q /y /i QMAKE_DEL_DIR 删除目录命令 rmdir QMAKE_DEL_FILE 删除文件命令 del QMAKE_MKDIR 创建目录命令 mkdir QMAKE_MOVE
一些项目开发中用到的qmake实用变量。 计算机架构 QMAKE_HOST.os 计算机系统 QMAKE_HOST.cpu_count 计算机CPU核心数 QMAKE_HOST.name 计算机名 QMAKE_HOST.version 系统版本 (数字形式) QMAKE_HOST.version_string 系统版本(字符串形式) QMAKE_PRE_LINK 编译链接前自动执行命令(注意不是编译前) QMAKE_POST_LINK 编译链接后自动执行命令 ($$QMAKE_HOST.name) # 计算机名 message($$QMAKE_HOST.version) # 系统版本(数字形式) message($$ QMAKE_HOST.version_string) # 系统版本(字符串形式) QMAKE_PRE_LINK += echo 'Start Build
49、QMAKE 指定 qmake 程序本身的名称并放置在生成的 Makefile 中。 86、QMAKE_EXTRA_TARGETS 指定附加 qmake 目标的列表。 87、QMAKE_FAILED_REQUIREMENTS 包含失败的需求列表。 90、QMAKE_HOST 提供有关运行 qmake 的主机的信息。 135、QMAKE_OBJECTIVE_CFLAGS 指定用于构建项目的目标 C/C++ 编译器标志。除了 QMAKE_CFLAGS 和 QMAKE_CXXFLAGS 之外,还使用这些标志。 142、QMAKE_MAKEFILE 指定要创建的 Makefile 的名称。 143、QMAKE_QMAKE 包含 qmake 可执行文件的绝对路径。注意:不要试图覆盖这个变量的值。
一些项目开发中用到的qmake实用变量。 计算机架构 QMAKE_HOST.os 计算机系统 QMAKE_HOST.cpu_count 计算机CPU核心数 QMAKE_HOST.name 计算机名 QMAKE_HOST.version 系统版本 (数字形式) QMAKE_HOST.version_string 系统版本(字符串形式) QMAKE_PRE_LINK 编译链接前自动执行命令(注意不是编译前) QMAKE_POST_LINK 编译链接后自动执行命令 ($$QMAKE_HOST.name) # 计算机名 message($$QMAKE_HOST.version) # 系统版本(数字形式) message($$ QMAKE_HOST.version_string) # 系统版本(字符串形式) QMAKE_PRE_LINK += echo 'Start Build
qmake 有一个安装集的概念。 变量来指示 qmake 这个对象是要构建的目标: QMAKE_EXTRA_TARGETS += mytarget mytarget2 这就是实际构建自定义目标所需要做的全部工作。 如果明确启用跟踪,qmake 会在适当的情况下尝试跟踪库的依赖项。 第一步是在库本身中启用依赖项跟踪。 安装库时,通过在 INSTALLS 声明中将其指定为目标,qmake 会自动将 .prl 文件复制到安装路径。 .prl 文件应仅由 qmake 创建,不应在操作系统之间传输,因为它们可能包含平台相关信息。
1>Reading Qt configuration (D:/SoftWare/QT5.9.3/5.9.3/msvc2017_64/bin/qmake) 1>GHViewerDetect.vcxproj : error : ERROR running qmake 1>GHViewerDetect.vcxproj : error : qmake: (D:/SoftWare/QT5.9.3/5.9.3/ msvc2017_64/bin/qmake) 1>GHViewerDetect.vcxproj : error : qmake: $PWD=D:\project\GHView\GHView\GHViewerDetect \x64\Debug\qmake\temp 1>GHViewerDetect.vcxproj : error : qmake: Project ERROR: Unknown module(s) in QT: networkauth 1>GHViewerDetect.vcxproj : error : qmake: Error creating Makefile 1>GHViewerDetect.vcxproj
Qmake的TEMPLATE变量用来设置Qt项目的构建类型。
0x00 判断某个类型是否存在: 原型: defined(name[, type]) type 含义 test 检查测试函数 replace 检查代替函数 var 检查变量 示例(判断变量是否存在): defined(COPY_TARGET, var) { ... } 0x01 变量列表是否包含某个变量 原型: contains(variablename, value) 示例: contains(QT, core) { ... } 0x02 判断变量值是否相等 原型: equals(var
用 cmake 构建Qt工程(对比qmake进行学习) cmake vs qmake qmake 是为 Qt 量身打造的,使用起来非常方便 cmake 使用上不如qmake简单直接,但复杂换来的是强大的功能 (目前QtCreator为qmake也默认启用了该功能。 Using CMake to Build Qt Projects 一文中说: 对简单的Qt工程,采用 qmake 对复杂度超过 qmake 处理能力的,采用 cmake 尽管如此,如果简单Qt的工程都不知道怎么用 这也是为什么 很多人添加Q_OBJECT宏后不重新运行qmake会出错误的原因。 只是: MinGW 下仅仅这么做还不行,上面的 MinGW 块用来修复这个问题 Debug 与 Release qmake 使用 qmake 时,可以在 pro 文件内分别为两种模式设置不同的选项
QMake的unix:!android语句一般指的是arm平台。 QMake的INSTALLS变量描述: https://doc.qt.io/qt-5/qmake-variable-reference.html#installs
介绍些qmake使用频率较高的函数。
qmake基于一个项目文件这样的信息来生成makefile。项目文件可以由开发者生成。 不用修改项目文件,qmake也可以为Microsoft Visual Studio生成项目。 /Bin/Debug/ QMAKE_LFLAGS_DEBUG += -Wl,-rpath=../../Bin/Debug/ QMAKE_LFLAGS_RELEASE += -L$$PWD/../.. += -shared QMAKE_LFLAGS += -L$$PWD/../.. 生成makefile (makefile是根据.pro文件参数生成的): qmake -o Makefile hello.pro qmake -t vcapp -o hello.dsp hello.pro 可以使用qmake -h查看具体的说明 qmake生成makefile 调试经验 在linux平台下可以用ldd命令查看so库所依赖的其他so库,readelf -d libxxx.so | grep
在我们编译别人发送的项目时,有时候会出现qmake编译失败的情况,那怎么办?
由于Qt的跨平台,其对应的编译配置工具QMake也是跨平台,这意味着QMake语法关键词大部分使用到的东西都是跨平台的。 利用QMake跨平台特性整理出一些跨平台系统命令。 如下表(windows平台): 关键词 命令 含义 QMAKE_CHK_DIR_EXISTS if not exist 检查目录是否存在 QMAKE_COPY copy /y 复制文件 QMAKE_COPY_FILE copy /y 复制文件 QMAKE_COPY_DIR xcopy /s /q /y /i 复制目录 QMAKE_DEL_DIR rmdir 删除目录 QMAKE_DEL_FILE del 删除文件 QMAKE_MKDIR mkdir 创建目录 QMAKE_MOVE move 移动/重命名
在qt/mkspecs中的每一个目录里面,都有一个包含了平台和编译器特定信息的qmake.conf文件。这些设置适用于你要使用qmake的任何项目,请不要修改它,除非你是一个专家。 例如,假如你所有的应用程序都必须和一个特定的库连接,你可以把这个信息添加到相应的qmake.conf文件中。 项目(.pro)文件 一个项目文件是用来告诉qmake关于为这个应用程序创建makefile所需要的细节。 “app”模板 “app”模板告诉qmake为建立一个应用程序生成一个makefile。当使用这个模板时,下面这些qmake系统变量是被承认的。 你只需要使用那些你已经有值的系统变量,例如,如果你不需要任何额外的INCLUDEPATH,那么你就不需要指定它,qmake会为所需的提供默认值。
QMAKESPEC QMAKE_AR_CMD QMAKE_BUNDLE_DATA QMAKE_BUNDLE_EXTENSION QMAKE_CC QMAKE_CFLAGS QMAKE_CFLAGS_DEBUG QMAKE_CLEAN QMAKE_CXX QMAKE_CXXFLAGS QMAKE_CXXFLAGS_DEBUG QMAKE_CXXFLAGS_RELEASE QMAKE_CXXFLAGS_SHLIB QMAKE_EXT_YACC QMAKE_EXT_OBJ QMAKE_EXT_CPP QMAKE_EXT_H QMAKE_EXTRA_COMPILERS QMAKE_EXTRA_TARGETS QMAKE_FAILED_REQUIREMENTS QMAKE_LIBS_OPENVG QMAKE_LIBS_THREAD QMAKE_LIBS_X11 QMAKE_LIB_FLAG QMAKE_LINK QMAKE_LINK_SHLIB_CMD QMAKE_LN_SHLIB QMAKE_MAC_SDK QMAKE_MACOSX_DEPLOYMENT_TARGET QMAKE_MAKEFILE QMAKE_QMAKE QMAKE_RESOURCE_FLAGS QMAKE_RPATHDIR