【问题标题】:How to get -std=c++11 w/ libstdc++?如何获得 -std=c++11 w/libstdc++?
【发布时间】:2016-04-16 05:23:45
【问题描述】:

为什么这不起作用:

#include <regex>
int main() {
   return 0;
}

编译为:

clang++ -std=c++11 -stdlib=libstdc++ temp.cpp
temp.cpp:1:10: fatal error: 'regex' file not found
#include <regex>
         ^
1 error generated.


clang++ --version
Apple LLVM version 7.0.0 (clang-700.1.76)
Target: x86_64-apple-darwin14.5.0
Thread model: posix

如果我允许stdlib 成为libc++,那么它会编译。正则表达式是c++11,但clang 本身似乎对-std=c++11 -stdlib=libstdc++ 都没有问题。至少在我的机器上,看起来我可以在 /usr/include/regex.h 中使用一些东西,但这不是标准的,而且除了正则表达式之外我还想使用其他东西(例如 std::to_string)。

出现此问题的原因是因为我想链接到第三方库(我没有源代码),该库被编译为 std::string 而不是 std::__1::basic_string,但我的代码使用std::regexstd::to_string。我不确定是否要引入对 boost 的依赖。

【问题讨论】:

  • 也许您的 libstc++ 不符合 C++11 标准?
  • 我是 OSX 10.10.5,所以我认为 Apple 会胜任...
  • This 可能会有所帮助。
  • &lt;regex&gt; 在 gcc-4.9 附带的版本之前无法在 libstdc++ 中正常运行,请参阅this。也许你有一个旧版本。
  • clang 有自己的标准库,你可以用吗?

标签: c++ c++11 clang libstdc++ libc++


【解决方案1】:

Apple 在 OS X(我认为是 4.2.1)中提供了一个非常旧的 libstdc++ 版本。该版本不完全支持 C++11,因此您需要获取更新的版本才能使用 std::regex

【讨论】:

  • 如果-std=c++11 -stdlib=libstdc++ 是互斥的,恕我直言,应该有一个警告!
  • 它们在技术上并不相互排斥,即使是默认发布的版本。 libstdc++ 4.2.1 确实支持在它发布时(2007 年中)提出的一些 C++11 特性。
  • 我想这个 SO 问题可以作为警告! :-)
【解决方案2】:

OS X 附带的 libstdc++ 版本来自 gcc-4.2.1,这是 FSF 决定采用 GPL3 之前的最后一个 GCC 版本。 Apple 在 OS X Lion 中弃用了 libstdc++,转而支持 LLVM 项目中的 libc++。如果你想在 OS X 上使用 C++11,你应该使用-std=c++11 -stdlib=libc++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多