我有一个带有 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_REQUIRED
到 ON
。
示例用法:
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/