c++ - 在 QMake 中,仅当目标支持 C++20 时,如何添加子目录?
问题描述
我想在所有可用的 C++ 版本中运行我的单元测试,所以我有一个像这样的目录结构
tests/
component/
tst_component.cpp
cxx11/
cxx14/
cxx17/
cxx20/
我在 C++ NNtst_component.cpp
中的每个子目录中使用. 如果编译器支持所有这些(1z 用于 17,2a 用于 20,用于较旧的 qmake),则此方法效果很好。但是在我们的 CI 上,我有一个编译器太旧,无法理解添加到命令行的选项,所以当编译器不支持(甚至是 C++ 的子集)时,我想有条件地排除 cxx20 子目录20.cxxNN
CONFIG += c++NN
-std=c++2a
CONFIG+=c++2a
我知道
CONFIG(QT_CONFIG, c++2a):SUBDIRS += cxx20
但这是在测试Qt是否以 C++20 模式构建,这不是我想要的。这就是我使用 atm 来通过 CI 进行更改的方式,但这当然意味着,在有人安装使用 C++20 构建的 Qt 之前,C++20 模式实际上并未在 CI 上进行测试。
有没有一种方法独立于 Qt 的构建方式并且不涉及在构建系统中手动维护编译器版本白名单?
编辑:20210609类似于配置测试的东西:我尝试编译一些东西,CONFIG+=c++2a
如果可行,设置了一些标志(比如have_cxx20
,让我说have_cxx20:SUBDIRS+=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
主项目/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.pro
load(configure)
qtCompileTest(test) {
message("CPP20 test passed")
} else {
message("CPP20 test failed")
}
TARGET = mainproject
SOURCES += main.cpp
推荐阅读
- i2c - 通过 coreboot I²C DesignWare 从 EEPROM m24lc128 读取字节
- reactjs - Material UI:在页面左下角显示对话框
- angular - ERROR 错误:尝试比较“[object Object]”时出错。角度 11 中只允许使用数组和可迭代对象
- javascript - 我在下面的数组对象中有数据,想转换另一种数组对象格式
- javascript - 使用 JavaScript 显示多个实体之间的连接
- javascript - 我可以只导出 .d.ts 中的部分接口吗?
- r - 覆盖R S3类中的基本方法?
- angular - Angular:最大调用堆栈大小超出错误命令失败,退出代码为 1
- python - 访问 Google Colab 中与我共享的云端硬盘文件夹
- compiler-errors - 错误:Part::pkspec1:表达式 i 不能用作零件规范