从libstdc++到libc++

苹果在 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    
                #define TR1_TUPLE    
                #define TR1_MEMORY    
    #else   
                #define AUTO(x, y) typeof(y) x = y   
                #define TYPEOF(x)    typeof(x)   
                #define TR1_MEMORY    
                #define TR1_FUNCTIONAL     
                #define TR1_TUPLE    
#endif

基本上主要修改就是这些,在移植过程中遇到很多编译的坑,不过还好都一一解决了,如果大家遇到什么编译问题,可以留言,看看我是否遇到过。

已经编译过的第三方类库包括freetype jbig2dec jpeg openjpeg skiabasic webp harfbuzz

你可能感兴趣的:(从libstdc++到libc++)