Xcode两个静态库存在重复.o文件

问题:关于Xcode引入第三方静态库导致出现重复的.o文件而报错(本例导入腾讯语音评测和工程中其他静态库出现.o文件重复)如图:

 

 

 

 

 

 

 

 

 

错误提示是:在x86_64环境下,libWXVoiceSpeex.a存在6个.o文件冲突。

 

解决方案:

1. 在工程中Build Setting -> Other Linker Flags 删除“-all_load”,删除“-all_load”可能会引起其他静态库出问题;

2. 打包时去掉 一方;

3. 使用ar命令在其中一个包中删除指定的重复编译的.o文件。

 

本篇博客使用第三种方案来解决重复编译的.o文件。

 

解决思路:

1. 使用lipo将目标.a文件进行拆分;

2. 对拆分后的文件,使用ar命令删除其中冲突的.o文件;

3. 使用lipo对操作后的拆分文件进行合并。

 

具体操作:

第一步,查看需要拆分的框架及拆分:

1. 将libWXVoiceSpeex.a文件修改名字为lib.a(没有其他作用,只为操作方便),将lib.a文件单独放入一个文件夹中,方便操作。

2. 使用cd 找到目标所在文件夹,使用“lipo -info lib.a”查看此.a文件中所能拆分的框架。

2.1 如果报如下错误,“xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), 

missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun”因为Mac最新场景下安装Xcode时已经没有Command Line了,需要单独安装。执行:

xcode-select --install

2.2 如果没有错误,可以看到此.a文件所需要拆分的框架,如图:

3. 发现需要拆分的框架有5个,执行下面代码对.a文件进行拆分:thin后面是对应需要拆分的框架,output是拆分后输出的名字,可以随意写

lipo lib.a -thin armv7 -output subv7.a
lipo lib.a -thin armv7s -output subv7s.a
lipo lib.a -thin i386 -output subi386.a
lipo lib.a -thin x86_64 -output subx8664.a
lipo lib.a -thin arm64 -output sub64.a

3.1 拆分后结果如下图:

4. 可以查看每个拆分后的文件中,是否存在重复的.o文件,上面已经发现x86_64的框架中存在重复编译的“testenc.o”,使用下面命令进行查看拆分的文件:

ar -t subx8664.a

4.1 结果如图,发现存在“testenc.o”文件

 

第二步,分别删除重复的.o文件:

1. 第一步已经将目标.a文件拆分为多个框架下的.a文件,现在使用如下命令,将拆分后的文件分别删除重复.o文件,操作以删除“testenc.o”为例:

ar -d subv7.a testenc.o
ar -d subv7s.a testenc.o
ar -d subi386.a testenc.o
ar -d subx8664.a testenc.o
ar -d sub64.a testenc.o

1.1 然后查看“subx8664.a”文件,发现里面的“testenc.o”已经删除,结果如图:

 

第三步,将删除后的文件进行合并:

1. 为了验证是否已经删除,将操作后的拆分文件进行合并(实际应该将所有重复的.o文件都删除后再进行合并)执行下面代码进行合并:

lipo -create subv7.a subv7s.a sub64.a subi386.a subx8664.a -output libWXVoiceSpeex.a

1.1 结果如下:

2. 输出一个合并好的“libWXVoiceSpeex.a”文件,将文件替换到工程的文件,编译验证,结果如图:

发现重复的.o文件剩余5个,重复的“testenc.o”文件已经被删除。

 

第四步,完成剩余步骤:

1. 继续执行第二步,将拆分后的文件分别删除其余5个重复的.o文件。

2. 所有重复文件删除完毕后,执行第三步进行合并,将合并的后的文件替换工程中的文件。

 

至此,操作完成,编译成功。

 

 

操作不难,耐心、细心即可。

 

 

posted @ 2019-11-07 17:32  Self_Discipline  阅读(1104)  评论(0编辑  收藏  举报