从Xcode10不再支持libstdc++说起

某个静态库如果以前是依赖于libstdc++库中的代码,那么这个静态库在Xcode10中被链接时将会报符号找不到的链接错误信息:Undefined symbols for architecture XXX,比如下面的提示:Undefined symbols for architecture x86_64:  "std::__throw_length_error(char const*)", referenced from:      std::vectorint, std::allocatorint>...正是因为内联命名空间的使用,所以工程中的代码是可以切换不同版本的C++标准库的,而且还可以同时链接两个不同的C++标准库libstdc++.dylib和libc++.dylib,因为这两个不同版本中的代码所在命名空间是不一样的,因此不会产生符号重复和冲突的错误...move to libc++ [-Wdeprecated]ld: library not found for -lstdc++clang: error: linker command failed with exit code 1 (use -v to see invocation)前面已经分析了Xcode10对两个标准库支持的来龙去脉,而且也简单的介绍了只要将老版本中的libstdc++.dylib拷贝到新版本的IDE环境中即可,具体的方法和流程大家可以参考如下两篇文章:https://blog.csdn.net/box_kun/article/details/80756832https://blog.csdn.net/u010960265/article/details/82754136但其实这样是有风险的,因为Xcode10中对于C++标准库的头文件都是基于C++11的,因此当你通过上述方法引入了老版本的C++标准库时,虽然在编译链接时不会报错正常编译通过,但是在运行时就可能会出现崩溃的问题,尤其是当你的静态库中将某个老的C++标准库中类的对象作为接口或者函数参数暴露出来给外界使用时就有可能因为新老版本的数据结构和内部实现的差异而造成运行时的崩溃。

扫描二维码分享话题