iOS开发中解决第三方静态库符号冲突的终极方案
背景
在iOS开发的时候,经常会使用各种第三方静态库,这些库内部可能会打包了相同的第三方库。那么在链接的时候就会发生符号冲突。
例如:A厂商提供的libA.a 和 B厂商提供的libB.a 内部可能都打包了libssl.a
终极解决方案
在linux平台发生这样的事情时,可以使用objcopy来修改符号名称。
但在Macos平台上没有这个命令。卧槽。。。那怎么办?
好在,可以使用Xcode的编译工具链中的ld命令来解决。
工具链的路径:
ls /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
使用ld命令隐藏不想导出的符号
第1步:ar -x 解开静态库 (如果是fat库,先lipo为thin库;如果静态库中有重名.o,需要单独ar -x解出然后重命名)
mkdir mytmp; cd mytmp
ar -x /path/to/libA.a
cd ..
第2步:ld命令将多个.o链接为一个.o,且设置要导出的符号
ld -r mytmp/*.o -o libA_2.o -bitcode_bundle -exported_symbols_list exported_symbols_list.txt
参数解释:
-bitcode_bundle