动态库由于二级命名空间,不会符号冲突
静态库是.o文件的合集,最终生成macho需要链接 ,被主app项目符号合并
app里的符号会把静态库的符号链接到一起,合并成一张符号表,在链接静态库符号时候,
other linker Flags 就是对链接静态库的配置
dead strip
不被main函数引用,的非导出符号会被干掉, oc默认都是导出符号,加个static就是本地符号了, 由于库要暴露一些方法被外界调用,所以导出符号不可以被干掉
默认配置other link flags是 -noall_load
Xlinker -noall_load:dead strip,默认不加载所有静态库的所有,有一样的类,只加载一个
-Xlinker -all_load :不dead strip,加载所有静态库的全部代码
-Xlinker -ObjC:加载全部OC相关代码,包括分类
-force_load: 指定要加载那个静态库的全部代码
-Xlinker就是告诉clang向ld传递参数,并且以上四个参数只对链接静态库时起作用,Xcode Build Settings中的dead_strip是链接器提供的一种优化方式,和这里链接静态库传递的参数不是一回事。
我们cocoapods里面other link flags Xlinker的配置是-ObjC,如果两个不同名字静态库有一样的类就冲突了
用llvm 的 llvm-objcopy --redefine-syms命令来修改冲突的符号
llvm-objcopy可执行文件可以用配置好的llvm编译好得到
要单一架构静态库处理符号,如果是多架构自行剥离,分别处理再合并
1 创建 aaa.m文件 写入新旧符号
拷贝冲突的符号 OBJC_CLASS后面加个前缀My_,两个中间有空格,如果有多个冲突符号,换行写
OBJC_CLASSMy_AFURLSessionManager
OBJC_METACLASSMy_AFURLSessionManager
2
--redefine-syms直接对macho执行提示失败,那我们就解压静态库,对对应的.o文件修改符号
ar -x 解压静态库成.o
拖入llvm-objcopy路径
3 用下面命令修改符号
/Users/mac/Desktop/xxx/llvm-objcopy --redefine-syms /Users/mac/Desktop/xxx/aaa.m xxx.o
4 nm -pa xx.o
看修改后的符号是否有前缀了,如果有的话就说明成功了
5 ar -rcs 合并静态局
然后加入项目后,编译一切ok,功能都正常