QMake:测试功能没有按预期工作
QMake: test functions do not work as expected
在 QtCreator 4.2.0 中,我尝试使用一个 *.pro 文件为多种硬件配置构建二进制文件。
在 Build & 运行 => Build Settings => Build Enviroment 我定义环境变量 TARGET
如下:
- 构建设置 A:变量
TARGET
具有值 bbb
- 构建设置 B:变量
TARGET
具有值 desktop
在 pro 文件中,我使用以下测试函数:
equals($$TARGET,"bbb")
{
message("setting include paths for bbb"))
message($$TARGET)
}
equals($$TARGET,"laptop")
{
message("setting include paths for laptop.")
message($$TARGET)
}
contains($$TARGET,"*bbb*")
{
message("setting include paths for bbb"))
message($$TARGET)
}
contains($$TARGET,"*laptop*")
{
message("setting include paths for laptop.")
message($$TARGET)
}
我在 运行 qmake:
时得到这个输出
Project MESSAGE: setting include paths for bbb
Project MESSAGE: bbb
Project MESSAGE: setting include paths for laptop.
Project MESSAGE: bbb
Project MESSAGE: setting include paths for bbb
Project MESSAGE: bbb
Project MESSAGE: setting include paths for laptop.
Project MESSAGE: bbb
Project MESSAGE: setting include paths for bbb
这对我来说毫无意义,我不知道我在这里做错了什么。为什么 laptop
测试后的部分被执行了?
顺便说一下,我使用 Scopes
解决了我的问题。这非常适合我:
CONFIG += $$(TARGET_HW)
desktop {
message("setting include paths for laptop.")
}
cetec {
message("setting include paths for cetec."))
}
但我仍然对使用测试函数的正确方法感兴趣。
我提供第一次测试的正确语法,作为例子:
equals(TARGET,"bbb") {
message("setting include paths for bbb"))
message($$TARGET)
}
请注意:
- 大括号在测试的同一行。
- 测试的变量没有美元符号,只有变量名
左大括号必须与条件(https://doc.qt.io/qt-5/qmake-language.html#scope-syntax)写在同一行。
你的问题太多了,在之前正确的基础上再补充一个答案:
如@daru所说,需要打开大括号in the same line作为测试函数
TARGET 是一个 internal variable,默认包含项目文件的基本名称。它成为您正在构建的可执行文件或库的名称。
您可以使用一个 environment variable 命名的 TARGET,但是您应该将它分配给一个具有另一个名称的 qmake 变量名称。
示例代码:
TGT=$$(TARGET)
equals(TGT,"bbb") {
message("$$TGT equals bbb"))
message(TGT=$$TGT)
}
equals(TGT,"laptop") {
message("$$TGT equals laptop")
message(TGT=$$TGT)
}
contains(TGT,"bbb") {
message("$$TGT contains bbb"))
message(TGT=$$TGT)
}
contains(TGT,"top") {
message("$$TGT contains top")
message(TGT=$$TGT)
}
在 QtCreator 4.2.0 中,我尝试使用一个 *.pro 文件为多种硬件配置构建二进制文件。
在 Build & 运行 => Build Settings => Build Enviroment 我定义环境变量 TARGET
如下:
- 构建设置 A:变量
TARGET
具有值bbb
- 构建设置 B:变量
TARGET
具有值desktop
在 pro 文件中,我使用以下测试函数:
equals($$TARGET,"bbb")
{
message("setting include paths for bbb"))
message($$TARGET)
}
equals($$TARGET,"laptop")
{
message("setting include paths for laptop.")
message($$TARGET)
}
contains($$TARGET,"*bbb*")
{
message("setting include paths for bbb"))
message($$TARGET)
}
contains($$TARGET,"*laptop*")
{
message("setting include paths for laptop.")
message($$TARGET)
}
我在 运行 qmake:
时得到这个输出Project MESSAGE: setting include paths for bbb
Project MESSAGE: bbb
Project MESSAGE: setting include paths for laptop.
Project MESSAGE: bbb
Project MESSAGE: setting include paths for bbb
Project MESSAGE: bbb
Project MESSAGE: setting include paths for laptop.
Project MESSAGE: bbb
Project MESSAGE: setting include paths for bbb
这对我来说毫无意义,我不知道我在这里做错了什么。为什么 laptop
测试后的部分被执行了?
顺便说一下,我使用 Scopes
解决了我的问题。这非常适合我:
CONFIG += $$(TARGET_HW)
desktop {
message("setting include paths for laptop.")
}
cetec {
message("setting include paths for cetec."))
}
但我仍然对使用测试函数的正确方法感兴趣。
我提供第一次测试的正确语法,作为例子:
equals(TARGET,"bbb") {
message("setting include paths for bbb"))
message($$TARGET)
}
请注意:
- 大括号在测试的同一行。
- 测试的变量没有美元符号,只有变量名
左大括号必须与条件(https://doc.qt.io/qt-5/qmake-language.html#scope-syntax)写在同一行。
你的问题太多了,在之前正确的基础上再补充一个答案:
如@daru所说,需要打开大括号in the same line作为测试函数
TARGET 是一个 internal variable,默认包含项目文件的基本名称。它成为您正在构建的可执行文件或库的名称。
您可以使用一个 environment variable 命名的 TARGET,但是您应该将它分配给一个具有另一个名称的 qmake 变量名称。
示例代码:
TGT=$$(TARGET)
equals(TGT,"bbb") {
message("$$TGT equals bbb"))
message(TGT=$$TGT)
}
equals(TGT,"laptop") {
message("$$TGT equals laptop")
message(TGT=$$TGT)
}
contains(TGT,"bbb") {
message("$$TGT contains bbb"))
message(TGT=$$TGT)
}
contains(TGT,"top") {
message("$$TGT contains top")
message(TGT=$$TGT)
}