如何解决在 QMake 中,仅当目标支持 C++20 时如何添加子目录?
我想在所有可用的 C++ 版本中运行我的单元测试,所以我有一个像
这样的目录结构tests/
component/
tst_component.cpp
cxx11/
cxx14/
cxx17/
cxx20/
我使用 tst_component.cpp
在 C++NN 中的每个 cxxNN
子目录中编译 CONFIG += c++NN
。如果编译器支持所有这些(对于较旧的 qmake,1z 表示 17 和 2a 表示 20),这会很有效。但是在我们的 CI 上,我有一个编译器太旧了,无法理解 -std=c++2a
添加到命令行的 CONFIG+=c++2a
选项,所以我想在编译器不支持时有条件地排除 cxx20 子目录支持(甚至是)c++20。
我知道
CONFIG(QT_CONFIG,c++2a):SUBDIRS += cxx20
但那是在测试 Qt 是否是在 C++20 模式下构建的,这不是我想要的。这就是我使用 atm 来通过 CI 获取更改的内容,但这当然意味着 C++20 模式实际上不会在 CI 上进行测试,直到有人安装了用 C++20 构建的 Qt。
有没有一种方法可以独立于 Qt 的构建方式,并且不涉及在构建系统中手动维护编译器版本白名单?
EDIT:20210609 类似于配置测试的东西:我尝试使用 CONFIG+=c++2a
编译一些东西,如果可行,则会设置一些标志(例如 {{ 1}},让我可以说 have_cxx20
)?
解决方法
qmake 有一个编译测试功能,你可以用它来编译一个简单的源文件,其中包含一组定义的构建标志。请参阅 https://doc.qt.io/qt-5/qmake-test-function-reference.html#qtcompiletest-test 以获取参考,这里是此类项目的骨架:
mainproject/
├── config.tests
│ └── test
│ ├── test.cpp
│ └── test.pro
├── main.cpp
└── mainproject.pro
mainproject/config.tests/test/test.pro:
SOURCES = test.cpp ## can be just a simple main() function,or even testing some c++20 specific features
QMAKE_CXXFLAGS+= -std=c++20
mainproject/mainproject.pro
load(configure)
qtCompileTest(test) {
message("CPP20 test passed")
} else {
message("CPP20 test failed")
}
TARGET = mainproject
SOURCES += main.cpp
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。