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, 你试试在项目文件中。加上
--------------
之前将 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)
这两个是可以自由组合的。而当你要写类似这样的代码
就需要新的语言标准,并有新库的支持。
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; }
就需要新的语言标准,并有新库的支持。
相关文章推荐
- C++的iostream标准库之istringstream
- C++中为什么不允许通过返回类型重载函数的辩论
- C++的iostream标准库介绍
- C++ Tips: 标准库概览
- Thinking in C++ (1-9) C++为什么会成功
- C++的iostream标准库介绍
- 最新 C++的iostream标准库介绍(1)
- C++ 为什么要同时使用*和&符号?以及什么场合使用这种声明方式?
- 0.为什么学习C++
- 为什么c++程序调用c编译器编译的函数需要在调用前加上extern“C”
- C++ 标准库 STL 概述
- 为什么中国的程序员不敢对C++标准委员会说不?
- 为什么很多C++程序不能运行?
- C++的iostream标准库介绍
- 为什么C++中的拷贝构造函数参数不能值传递
- Linus为什么不用C++写Linux内核?
- 高质量c++(有了malloc/free 为什么还要new/delete )
- C++的iostream标准库介绍
- C++的iostream标准库介绍
- 为什么C++没有内建支持多线程