C++11 让cmake with clang使用c++;11(c+;+;14)

C++11 让cmake with clang使用c++;11(c+;+;14),c++11,stl,cmake,clang,c++14,C++11,Stl,Cmake,Clang,C++14,我的cmake项目将编译c++14代码。它还使用外部库(我的项目中的git子模块)中包含的CMakeLists.txts。macOS Sierra(cmake 3.6.2)上的构建失败,原因是。据我所知,clang附带了两个STL:libstdc++(来自gcc)(默认)或libc++。因此,如果我将-stdlib=libc++选项添加到cmake,源代码将编译: add_compile_options( "$<$<COMPILE_LANGUAGE:CXX>:-std=c++1

我的cmake项目将编译c++14代码。它还使用外部库(我的项目中的git子模块)中包含的CMakeLists.txts。macOS Sierra(cmake 3.6.2)上的构建失败,原因是。据我所知,clang附带了两个STL:libstdc++(来自gcc)(默认)或libc++。因此,如果我将
-stdlib=libc++
选项添加到cmake,源代码将编译:

add_compile_options( "$<$<COMPILE_LANGUAGE:CXX>:-std=c++14>" )
add_compile_options( "$<$<COMPILE_LANGUAGE:CXX>:-stdlib=libc++>" )
添加编译选项($)
添加编译选项($)
但它在链接时失败,因为它试图使用libstdc++进行链接。我如何在cmake中指定新的STL libc++应用于整个构建过程


PS:默认情况下使用gcc STL的原因是什么?我可以永久性地指定它应该使用哪个STL吗?还是我做了一些完全错误的事情(我的一些子项目会悄悄地强制gcc吗?)

我想,在clang的情况下,您还需要将flang传递给链接器:

link_libraries("-stdlib=libc++")

您应该依靠CMake来处理编译选项。只需指定所需的标准版本:

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
target\u compile\u功能也可用于要求标准的特定功能(并隐式要求CMake设置适当的配置)。更多信息


编辑

您找到了解决方案,还必须删除Ogred3D的CmakeList中的以下行:

set(CMAKE_OSX_DEPLOYMENT_TARGET 10.7)

删除它会阻止CMake添加导致错误的标志
mmacosx version min=10.7

它对我不起作用。我将Ogre3D作为一个子模块。让我们只考虑建立它独立。cmake配置进展顺利,但编译(通过make)失败。考虑它的CMAKELIST.TXT:。如果删除第35-43行并在顶部添加代码,编译将失败(c++14中未知的STL模板)。保持CMakeLists.txt不变,编译进行得很顺利(c++11)。经过大量挖掘(通过使用cmake的
make VERBOSE=1
查看编译器调用),是一个标志
mmacosx version min=10.7
导致编译错误。事实证明,Ogre3D的CMakeLists.txt就是问题所在:它设置了一行
(CMAKE\u OSX\u DEPLOYMENT\u TARGET 10.7)
。这实际上完全解决了我的问题!非常感谢。我将首先尝试使用
CMAKE_CXX_STANDARD
工作(如上面的答案所示),但您的答案正是我首先搜索的(虽然还没有尝试过)。更新:我的stdlib错误问题(以及上面的问题)是由我的一个子CMakeLists.txt中的一行
集(CMAKE_OSX_DEPLOYMENT_TARGET 10.7)
引起的;见下面的评论!