当qmake为运行时如何将变量传递给qmake项目文件
How to pass variables to qmake project file when qmake is run
我需要动态改变我的,例如在我的项目文件上调用 qmake
时应用程序名称和后续定义。
一个例子是:
include(version.pri)
QT += core gui network concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
FLAVOR = ?
TARGET = ../bin/$$FLAVOR
TEMPLATE = app
message("Application name: $$APP_NAME")
!defined(APP_NAME) {
APP_NAME = $$FLAVOR
}
!defined(APP_ORG) {
APP_ORG = myorg
}
//...
message("Application name 2: $$APP_NAME")
输出
Application name:
Application name 2: ?
以上是我的项目文件的摘录。
文档:
根据 Qmake documenation,我应该可以做到以下几点:
FLAVOR = xyz
!defined(APP_NAME) {
APP_NAME = $$FLAVOR
}
以上代码的用途:
检查是否定义了 APP_NAME(任何地方,甚至作为 qmake
参数传递)。如果未定义,则设置 APP_NAME
等于 FLAVOR
其中包含 xyz
我试过了:
qmake -config debug "DEFINES += APP_NAME = myappname"
qmake -config debug "APP_NAME = myappname"
qmake -config debug APP_NAME = myappname
其中 none 有效。
如何将定义传递给 qmake,这将在 Makefile 中设置一个变量,即如上例所示的 APP_NAME
?
请注意:一些答案表明问题标题存在问题。此后,我将标题编辑为更恰当地总结了我的问题和我希望实现的目标
您可以像这样将定义传递给 qmake:
qmake DEFINES+="APP_NAME myappname"
如果你想在 pro 文件中添加定义,你可以这样做:
DEFINES += "APP_NAME=myappname"
我假设您不是在尝试添加 DEFINES(如在预处理器中定义的那样,传递给编译器),而是添加到 "assign" QMake 项目文件中使用的变量。
以下对我有效:
QT += core gui network concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
FLAVOR = ?
TARGET = ../bin/$$FLAVOR
TEMPLATE = app
message("Application name: $$APP_NAME")
!defined(APP_NAME, var) {
APP_NAME = $$FLAVOR
}
message("Application name 2: $$APP_NAME")
使 "defined" 语句起作用的一个看似关键的更改是添加 "var" 作为第二个参数,如您所见。不知道为什么,但没有它,第二个输出是“?”,而第一个是正确的 "myappname".
qmake 的输出是:
...\Desktop\test_qmake>qmake -config debug "APP_NAME = myappname"
Project MESSAGE: Application name: myappname
Project MESSAGE: Application name 2: myappname
Project MESSAGE: Application name: myappname
Project MESSAGE: Application name 2: myappname
Project MESSAGE: Application name: myappname
Project MESSAGE: Application name 2: myappname
...\Desktop\test_qmake>qmake -v
QMake version 3.0
Using Qt version 5.7.1 in C:/Qt/5.7/mingw53_32/lib
// 编辑:关于 "defined" 语句,文档说“[...] 如果省略类型,则检查所有函数。”,其中 "type" 是第二个参数。似乎从字面上理解,即只检查函数,但不检查变量。
QMake function reference "defined"
我需要动态改变我的,例如在我的项目文件上调用 qmake
时应用程序名称和后续定义。
一个例子是:
include(version.pri)
QT += core gui network concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
FLAVOR = ?
TARGET = ../bin/$$FLAVOR
TEMPLATE = app
message("Application name: $$APP_NAME")
!defined(APP_NAME) {
APP_NAME = $$FLAVOR
}
!defined(APP_ORG) {
APP_ORG = myorg
}
//...
message("Application name 2: $$APP_NAME")
输出
Application name:
Application name 2: ?
以上是我的项目文件的摘录。
文档:
根据 Qmake documenation,我应该可以做到以下几点:
FLAVOR = xyz
!defined(APP_NAME) {
APP_NAME = $$FLAVOR
}
以上代码的用途:
检查是否定义了 APP_NAME(任何地方,甚至作为 qmake
参数传递)。如果未定义,则设置 APP_NAME
等于 FLAVOR
其中包含 xyz
我试过了:
qmake -config debug "DEFINES += APP_NAME = myappname"
qmake -config debug "APP_NAME = myappname"
qmake -config debug APP_NAME = myappname
其中 none 有效。
如何将定义传递给 qmake,这将在 Makefile 中设置一个变量,即如上例所示的 APP_NAME
?
请注意:一些答案表明问题标题存在问题。此后,我将标题编辑为更恰当地总结了我的问题和我希望实现的目标
您可以像这样将定义传递给 qmake:
qmake DEFINES+="APP_NAME myappname"
如果你想在 pro 文件中添加定义,你可以这样做:
DEFINES += "APP_NAME=myappname"
我假设您不是在尝试添加 DEFINES(如在预处理器中定义的那样,传递给编译器),而是添加到 "assign" QMake 项目文件中使用的变量。
以下对我有效:
QT += core gui network concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
FLAVOR = ?
TARGET = ../bin/$$FLAVOR
TEMPLATE = app
message("Application name: $$APP_NAME")
!defined(APP_NAME, var) {
APP_NAME = $$FLAVOR
}
message("Application name 2: $$APP_NAME")
使 "defined" 语句起作用的一个看似关键的更改是添加 "var" 作为第二个参数,如您所见。不知道为什么,但没有它,第二个输出是“?”,而第一个是正确的 "myappname".
qmake 的输出是:
...\Desktop\test_qmake>qmake -config debug "APP_NAME = myappname"
Project MESSAGE: Application name: myappname
Project MESSAGE: Application name 2: myappname
Project MESSAGE: Application name: myappname
Project MESSAGE: Application name 2: myappname
Project MESSAGE: Application name: myappname
Project MESSAGE: Application name 2: myappname
...\Desktop\test_qmake>qmake -v
QMake version 3.0
Using Qt version 5.7.1 in C:/Qt/5.7/mingw53_32/lib
// 编辑:关于 "defined" 语句,文档说“[...] 如果省略类型,则检查所有函数。”,其中 "type" 是第二个参数。似乎从字面上理解,即只检查函数,但不检查变量。 QMake function reference "defined"