MiP*_*MiP 38 c++ cmake visual-studio c++17
我正在使用VS 15.3,它支持集成的CMake 3.8.如何在不为每个特定编译器编写标志的情况下定位C++ 17?我当前的全局设置不起作用:
# https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# expected behaviour
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++lastest")
Run Code Online (Sandbox Code Playgroud)
我希望CMake在生成VS解决方案文件时添加"/ std:c ++ lastest"或等价物,但是没有找到c ++ 17标志,导致编译器错误:
C1189 #error: class template optional is only available with C++17.
Run Code Online (Sandbox Code Playgroud)
Som*_*ude 31
对于没有标准级别概念的编译器,例如MSVC,这没有任何效果.
简而言之,CMake尚未更新以适应VC++ 2017中添加的标准标志.
您必须检测是否使用了VC++ 2017(或更高版本)并自行添加相应的标志.
在CMake 3.10(及更高版本)中,这已针对较新版本的VC++进行了修复.请参阅3.10文档.
lon*_*ver 12
在现代CMake中,我发现最好在目标级别而不是全局变量级别分配CXX标准,并使用内置属性(见下文:https://cmake.org/cmake/help/latest/manual/cmake -properties.7.html)保持编译器不可知.
例如:
set_target_properties(FooTarget PROPERTIES
CXX_STANDARD 17
CXX_EXTENSIONS OFF
etc..
)
Run Code Online (Sandbox Code Playgroud)
您可以将其保留set(CMAKE_CXX_STANDARD 17)给其他编译器,例如Clang和GCC.但是对于Visual Studio来说,它毫无用处.
如果CMake仍不支持此功能,您可以执行以下操作:
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17")
endif(MSVC)
Run Code Online (Sandbox Code Playgroud)
CMake 标志中的 Bash 命令行:
-DCMAKE_CXX_STANDARD=17 \
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
-DCMAKE_CXX_EXTENSIONS=OFF \
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44209 次 |
| 最近记录: |