c++ - 在 Visual Studio 的 CMake 中启用对 C++17 的支持

标签 c++ visual-c++ cmake

我有一个带有 3 个库的简单 CMake (3.9.4) 项目。

基本库是一个接口(interface)库(只有标题)。它使用了 Visual Studio 中存在的 C++17 中的一些功能(如 constexpr if)。显然,我尝试设置一个目标属性,以便它传播到依赖库。

我试过:

target_compile_features(my_lib INTERFACE cxx_std_17)

但没有任何改变。

第二次尝试是:

set_target_properties(my_lib PROPERITES CXX_STANDARD 17)

但是我得到:

CMake Error at cpp/CMakeLists.txt:20 (set_target_properties):
INTERFACE_LIBRARY targets may only have whitelisted properties.  The
property "CXX_STANDARD" is not allowed.

最后我得到了:

target_compile_options(bit INTERFACE /std:c++17)

效果很好。这是一个正确的解决方案吗?看看所有的编译功能,我相信我可以做一些更好的事情。这也迫使我将上述命令包装在某种 if(MSVC) ... endif() 恶作剧中。

最佳答案

CMake 版本高于 3.10 support MSVC C++ standard switches , 但在早期版本中它们没有效果。

确保您的程序在 Visual Studio 上使用正确的 C++ 标准模式编译的唯一可移植方法是至少需要 CMake 3.10,设置目标属性 CXX_STANDARD到您想要的值和CXX_STANDARD_REQUIREDON

示例用法:

set_property(TARGET my_target PROPERTY CXX_STANDARD 17)
set_property(TARGET my_target PROPERTY CXX_STANDARD_REQUIRED ON)

注意:目前 CMake 3.10 的 CXX_STANDARD 文档错误地指出它对 MSVC 没有影响。跟踪此 here 时出现问题.

关于c++ - 在 Visual Studio 的 CMake 中启用对 C++17 的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46876433/

相关文章:

c++ - 为什么 '#pragma omp critical' 部分不能在同一行上有左大括号?

C++ 堆碎片分配错误?

c++ - 从 MFC 中的配置文件加载字符串

c++ - 是否可以将两种字符集放在同一个文件中

c++ - 不断产生链接器和库错误

java - 如何解决 "Could not find JNI",在 Raspberry Pi 上构建 OpenCV?

c++获取ip地址的代码

c++ - 使用 IDE 设置 CERN ROOT

c++ - 无法导出 cmake PROJECT_VERSION_MAJOR,因为它等于零

c++ - CMake:生成批处理文件调用 cl.exe