静态库冲突 & Git (20)
静态库冲突
冲突本质
-Objc 以及 -all_load 都没有问题, 都可以正常编译 -> 编译器优化
同一个静态库, 不同的名字
(AFNetWorking 与 AFNetWorking2) -> -all_load & -ObjC (注意大小写) ->会导致冲突 本质是符号冲突 section, 存放类信息 -> class_ro, class_rw
解决冲突
- 只有全局符号才会引起冲突
- 文件冲突 -> ar -> 静态库解压 -> 去除重名文件
- 不是文件冲突 改名字 (但是一般拿不到源码)
- 没有源码 符号表 + 前缀或者后缀重命名重复符号
- objcopy -> --prefix-symbols=prefix
llvm-objcopy --prefix-symbols=Cat_ (但是不支持MachO) llvm-objcopy --redefine-syms "旧"="新" 拖拽地址 会报错 -> 因为原生系统没有llvm-objcopy -> 找到llvm-objcopy工程找到错误 -> 添加case, break; -> 编译运行
旧符号 Cat_符号(注意一定要放前面, 不然会被认为是OC符号)
实际开中
- nm -gUAj 静态包 显示所有全局符号
- 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