背景
在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 - 如果libA.a包含bitcode,可使用本参数使得libA_2.o也包含bitcode。
-exported_symbols_list - 指定一个文件,该文件中配置了哪些符号将要被设置为导出,没有在该文件中出现的符号都会被隐藏。
exported_symbols_list.txt文件 - 文件中每行配置一个需要导出符号名,没有在本文件中出现的符号都会被设为隐藏
第3步:将libA_merge.o 打包为.a文件
ar -q libA_2.a libA_2.o
ranlib libA_2.a
【完】
网友评论