静态库冲突 & 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
网友评论