iOS开发中解决第三方静态库符号冲突的终极方案

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 - 如果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

【完】

如需技术支持请私信:359152155@qq.com

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空旅客er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值