众所周知从Xcode10起,苹果摒弃了对libstdc++库的支持转而支持libc++库了。这两个库在Xcode9甚至更早的版本就已经同时存在于系统中并且可供开发者选择,当然在Xcode9时代苹果就已经宣布了将要废弃libstdc++的信息了。
C++标准库
一个app应用程序中如果用到C++相关的代码和类库那么就需要链接C++标准库。C++标准库是一套基于C++语言之上的函数和类库,其早期代码都定义在std命名空间中,大部分类都是用template模板实现的,它主要由IO流,string字符串类,和STL组成。标准库中的实现代码除了分布在没有后缀的头文件(比如vector等大部分模板类)外还有一部分代码被存放到了相应的动态库中,也就是存放在libstdc++.dylib或者libc++.dylib中。至于为什么一个标准库由两个动态库来实现则会在后面进行详细介绍。
C++的规范版本
一门语言总是不可能一成不变的,C++也是如此,随着时间的推移它也会有升级变化的改进需求。但是C++这门语言却不像Swift那样不负责任,它的标准和规范的升级相对来说比较严谨。个人觉得原因是其本身已经非常庞大而且完善了,能升级的基本都是微小的调整了。也许你会发现其他很多语言都是C++这门语言的裁剪版。所以可以说学好C++,走遍天下都不怕! 下面这个表格列出的就是C++的各种版本:
在C++11标准出来以前,市面上的编译器厂商基本上支持的都是C++98的版本。大部分的书籍或者知识里面的语法和规则都是基于C++98的。C++11主要添加了: 类型自动推导、线程API支持、智能指针内存管理、lamda表达式、STL扩展等能力(如果你想更加详细了解这些新规范,请参考:C++11新特性介绍)。各大编译器厂商为了自身的需要会对规范进行一些定制化处理(这些语法的标准以及厂商的定制化称为方言Dialect)。目前比较流行的C++编译器有微软的VC++,GNU组织的gcc(g++), 苹果的LLVM(clang++)等。这些厂商或多或少的对C++的规范进行一些裁剪或者扩充以及对C++的各个版本的支持力度也有所不同。就目前来说主流的编译器几乎都对C++11标准已经完全支持了。
libstdc++.dylib和libc++.dylib
正如前面所说的C++有不同的版本,其中的libstdc++.dylib所代表的就是C++98版本的标准库实现动态库,而libc++.dylib所代表的则是C++11版本的标准库实现动态库。也就是说libc++其实一个更加新的C++标准库实现,它完全支持C++11标准,而苹果的Xcode10将不再支持老版本的标准库libstdc++实现,而是升级为只支持新版本的标准库libc++实现了。某个静态库如果以前是依赖于libstdc++库中的代码,那么这个静态库在Xcode10中被链接时将会报符号找不到的链接错误信息:Undefined symbols for architecture XXX,比如下面的提示: