【问题标题】:Enabling support for C++17 in CMake for Visual Studio在 CMake for Visual Studio 中启用对 C++17 的支持
【发布时间】:2017-10-22 16:22:41
【问题描述】:

我有一个包含 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() 恶作剧中。

【问题讨论】:

标签: c++ visual-c++ cmake


【解决方案1】:

高于 3.10 support MSVC C++ standard switches 的 CMake 版本,但在早期版本中无效。

要确保您的程序在 Visual Studio 上以正确的 C++ 标准模式编译,唯一可移植的方法是至少需要 CMake 3.10,将目标属性 CXX_STANDARD 设置为您想要的值,并将 CXX_STANDARD_REQUIRED 设置为 @987654327 @。

示例用法:

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 时出现问题。

【讨论】:

    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2021-03-30
    • 2018-01-23
    • 2019-07-16
    相关资源
    最近更新 更多