苹果在 XCode10 和 iOS12 中移除了 libstdc++ 这个库,由 libc++ 这个库取而代之,苹果的解释是 libstdc++ 已经标记为废弃有5年了,建议大家使用经过了 llvm 优化过并且全面支持C++11的 libc++ 库。
当然有很多临时解决办法,大家可以去网上搜索一下,无非是把libstdc++库拷贝到XCode12的sdk和模拟器里(真机为了兼容老版本,是有libstdc++库的)。
如果你依赖的第三方库是依赖stdc++的,如果有源码最好了,如果没有源码,那你只能期待第三方比较勤奋了。。。
下面主要说一下这个从libstdc++到libc++,需要改哪些东西:
xcode工程配置:
Targets--->Build Settings--->Apple Clang - Language - C++ --->C++ Standard Library,修改为libc++
C++类库编译:
编译参数:
-stdlib=libstdc++修改为-stdlib=libc++
另外建议加入-miphoneos-version-min=8.0 -fembed-bitcode(支持bitcode)这两个选项
宏定义:
MACRO_DEF+=-D_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR
MACRO_DEF+=-D_LIBCPP_ENABLE_TUPLE_IMPLICIT_REDUCED_ARITY_EXTENSION
代码,由于某些std类库命名空间,以及一些用法变化,所以要做相应的修改:
例如std::tr1::空间不存在,可以修改为std::
#ifdef __APPLE__
#define AUTO(x, y) auto x = y
#define TYPEOF(x) decltype(x)
#define TR1_FUNCTIONAL <functional>
#define TR1_TUPLE <tuple>
#define TR1_MEMORY <memory>
#else
#define AUTO(x, y) typeof(y) x = y
#define TYPEOF(x) typeof(x)
#define TR1_MEMORY <tr1/memory>
#define TR1_FUNCTIONAL <tr1/functional>
#define TR1_TUPLE <tr1/tuple>
#endif
基本上主要修改就是这些,在移植过程中遇到很多编译的坑,不过还好都一一解决了,如果大家遇到什么编译问题,可以留言,看看我是否遇到过。
已经编译过的第三方类库包括freetype jbig2dec jpeg openjpeg skiabasic webp harfbuzz