首页 > 解决方案 > QMake 不匹配用于发行版检测的正则表达式

问题描述

我有一个使用 QMake 的 C++ 项目。我正在尝试根据正在运行的 Linux 发行版的简单测试设置一些编译器选项,但测试没有通过。我的 qmake 文件包含:

OSDISTRO = $$(cat /proc/version)
contains(OSDISTRO, "Ubuntu"): {
  message(Found ubuntu)
}

我从命令行测试了正则表达式,它可以工作!

cat /proc/version | pcregrep "Ubuntu"
Linux version 4.18.0-20-generic (buildd@lcy01-amd64-020) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21~18.04.1-Ubuntu SMP Wed May 8 08:43:37 UTC 2019

qmake 中的正则表达式语法有什么特别之处吗?为什么这不起作用?

标签: regexqtqmake

解决方案


对于正则表达式:

这对我有用:

OSDISTRO = $$system(cat /proc/version)
contains(OSDISTRO, .*Ubuntu.*){
  message("Found Ubuntu")
}

注意: 匹配区分大小写。

您可以使用.*[uU]buntu.*例如来匹配ubuntuUbuntu

解释为什么您的解决方案不起作用:

QMake函数contains适用于值列表

因此,您的解决方案的执行将如下所示:

1)第一条指令OSDISTRO = $$(cat /proc/version)

  • QMake将执行$$system(cat /proc/version)

  • 然后将结果(按空格作为分隔符)拆分为值列表。OSDISTRO将包含此列表。

假设结果和你一样。第一条指令的结果是这样的: OSDISTRO = "Linux" "version" "4.18.0-20-generic"....

2)第二条指令contains(OSDISTRO, "Ubuntu") : message(Found ubuntu)

  • QMake将搜索变量是否OSDISTRO包含该值,如果成功则Ubuntu显示消息。Found ubuntu

在您的情况下,QMake将永远找不到Ubuntu,导致包含它的值是这样的(Ubuntu 7.3.0-16ubuntu3),并且QMake只搜索值Ubuntu

希望它可以帮助你。


推荐阅读