静态库冲突 & Git (20)

静态库冲突 & Git (20)

静态库冲突

冲突本质

-Objc 以及 -all_load 都没有问题, 都可以正常编译 -> 编译器优化
同一个静态库, 不同的名字(AFNetWorking 与 AFNetWorking2) -> -all_load & -ObjC (注意大小写) ->会导致冲突
本质是符号冲突
section, 存放类信息 -> class_ro, class_rw

解决冲突

  1. 只有全局符号才会引起冲突
  2. 文件冲突 -> ar -> 静态库解压 -> 去除重名文件
  3. 不是文件冲突 改名字 (但是一般拿不到源码)
  4. 没有源码 符号表 + 前缀或者后缀重命名重复符号
  5. objcopy -> --prefix-symbols=prefix
    1. llvm-objcopy --prefix-symbols=Cat_ (但是不支持MachO)
    2. llvm-objcopy --redefine-syms "旧"="新" 拖拽地址
    3. 会报错 -> 因为原生系统没有llvm-objcopy -> 找到llvm-objcopy工程找到错误 -> 添加case, break; -> 编译运行

旧符号 Cat_符号(注意一定要放前面, 不然会被认为是OC符号)

实际开中

  1. nm -gUAj 静态包 显示所有全局符号
  2. python 来写
import subprocess
import re

def getSymbols(path):
    return subprocess.getoutput(f'nm -gUAj {path}')
    
def writeNewSymbolsToFile(syms, path, newPath)
    newStr = re.sub(rf'{path}[:](.+)(.o:)', '', syms)
    print(newStr)
    lines = newStr.splitlines()
    newSys = ''
    for s in lines:
        word = s.strip('\n')
        # word Cat_word
        newSys += word + ' ' + f'_Cat{word}' + '\n'
        print(newStr)
    with open(newPath, 'w') as file:
        file.write(newSys)

if __name__ == '__main__';
    path = '静态库路径'
    sys = getSymbols(path)
    # 注意路径可以拼一个简单的
    writeNewSymbolsToFile(sys, path, "新路径")

-all_load 还是有问题 -> 改的符号太多(因为是全都修改了, 不冲突的也修改了)

  • 把冲突的其中一个改成动态库就可以 (二级命名空间)
    • 二级命名空间 -> APP 使用 动态库符号 -> 查找方法是 动态库名字.sys

Git

远程仓库

// 远程仓库拉取
git init --bare

你可能感兴趣的:(静态库冲突 & Git (20))