您的位置:首页 > 移动开发

Apple 为什么在 Mavericks 里把 C++ 标准库从 libstdc++ 改成 libc++?

2015-01-04 20:41 337 查看
原文链接:http://www.zhihu.com/question/23507141

libc++ 为 LLVM 项目重新编写,包含 C++ 11 标准库。如,smart pointer,function, tuple,unordered_map,unordered_set等。这些库简化了代码。另外 libc++ 支持 move 语意,速度也有加快。

libstdc++ 是 GNU 项目的标准库。Apple 中默认的版本是旧的,不支持新的标准库特性。

几年前,Apple 就有意识的去 GNU 了。(参考李洋答案中提到的文章,Mac OS X 背后的故事(八)三好学生Chris Lattner的LLVM编译工具链

在我使用 Xcode 3 的时候,编译器还是GNU C++,采用libstdc++。现在Xcode 5,默认就是 LLVM,libc++。在Xcode 中,C++ Standard Library 选项中,还是可以选择使用,libstdc++ 或者 libc++。

Xcode 只是个IDE,背后的工具换了。准确的说,默认工具换了。要使用以前的,可以设置回来。

对我来说,Apple 这个变化是好的。采用 LLVM 后,编译速度明显变快,智能提示和错误信息明显变好。至于库libc++, 换了之后,我就可以采用新的标准库。

boost库重新编译一下就行了。(我使用 boost 是不编译的,直接设置头文件目录,少量的库有 cpp,也直接添加 cpp 到工程中。可能我使用 boost 还不够多)。

至于QT, 你试试在项目文件中。加上

CONFIG += c++11


--------------

之前将 GNU 错写成 GUN,已修正。另外,评论和后来的答案提到 GNU 的新版本库是支持 C++ 11 的,也修正,注明了苹果默认的gcc版本是旧的。多谢提醒。

Xcode中,C++ 语言和库版本都可以设置。设置不同选项,只是编译链接时候使用不同的参数。

C++ Language Dialect,可以选择语言版本

选项有

C++98[-std=c++98]

GNU++98 [-std=gnu++98]

C++11[-std=c++11]

GNU++11[-std=gnu++11]

C++ Standard Library, 可以选择库的版本

选项有

libstdc++ (GNU C++ standard library)

libc++ (LLVM C++ standard library with C++ 11 support)

这两个是可以自由组合的。而当你要写类似这样的代码

std::vector<int> v = { 1, 2, 3, 4, 5 };
for (auto& i : v)
{
i *= 2;
std::cout << i << std::endl;
}


就需要新的语言标准,并有新库的支持。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: