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

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

作者: 我思故我在2020 | 来源:发表于2020-09-15 17:37 被阅读0次

    背景

    在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
    

    【完】

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/cyvfyktx.html