【问题标题】:Let cmake with clang use c++11 (c++14)让cmake和clang一起使用c++11(c++14)
【发布时间】:2017-03-20 00:51:12
【问题描述】:

我的 cmake 项目将编译 c++14 代码。它还使用其外部库(我的项目中的 git 子模块)中包含的 CMakeLists.txts。在 macOS Sierra (cmake 3.6.2) 上构建失败,因为the default STL of clang is old and doesn't handle c++11。据我了解,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 太旧,clang 默认使用 gcc STL 的原因是什么?我可以永久指定它应该使用哪个 STL 吗?还是我做错了什么(我的一些子项目可以默默地强制 gcc 吗?)?

【问题讨论】:

  • 更新:我的错误 stdlib 问题(以及上述问题)是由我的子 CMakeLists.txt 之一中的一行 set(CMAKE_OSX_DEPLOYMENT_TARGET 10.7) 引起的;请参阅下面的评论!

标签: c++11 stl cmake clang c++14


【解决方案1】:

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

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

target_compile_features 也可用于要求标准的特定功能(并隐式要求 CMake 设置适当的配置)。更多信息here.


编辑

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

set(CMAKE_OSX_DEPLOYMENT_TARGET 10.7)

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

【讨论】:

  • 它对我不起作用。我有 Ogre3D 作为子模块。让我们只考虑独立构建它。 cmake 配置顺利,但编译(通过 make)失败。考虑它的 CMakeLists.txt:bitbucket.org/sinbad/ogre/src/…。如果我删除第 35-43 行并将您的代码添加到顶部,则编译将失败(来自 c++14 的未知 STL 模板)。保持 CMakeLists.txt 不变,编译顺利(c++11)。
  • 经过大量挖掘(通过使用make VERBOSE=1查看cmake的编译器调用),这是一个标志mmacosx-version-min=10.7导致编译错误by giving it the wrong headers。事实证明,Ogre3D 的 CMakeLists.txt 是问题所在:它有一行 set(CMAKE_OSX_DEPLOYMENT_TARGET 10.7)。这实际上完全解决了我的问题!
【解决方案2】:

我想,您还需要在 clang 案例中将该法兰传递给链接器:

link_libraries("-stdlib=libc++")

【讨论】:

  • 谢谢!我将首先尝试让CMAKE_CXX_STANDARD 工作(如上面的答案),但你的答案是我首先要寻找的(虽然还没有尝试过)。
猜你喜欢
  • 2021-01-23
  • 1970-01-01
  • 2016-05-14
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多