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

原文链接: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;
    }
就需要新的语言标准,并有新库的支持。

你可能感兴趣的:(ios,C++,xcode,C++11,llvm)