duplicate symbols for architecture arm64 .a静态库冲突

1.引入头文件错误.出现.m的文件.

2.other linker flags  -ObjC 与 -all_load切换尝试    或 -force_load(需要手动引入文件地址) 

-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中

-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。

-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载

3.检查Architectures 配置

4.在Other linker flags  添加不用oc代码的标示  可以过滤掉冲突的部分(写的标示 我删掉之后找不到了 --)

5.引入.a静态库出现冲突的话如下图所示,就打开静态库 删除

duplicate symbols for architecture arm64 .a静态库冲突_第1张图片

5.1 最舒服的手动删除 适合 比较多的.0文件冲突

创建一个文件夹 把出错的.a文件拉进去 下面开始 使用ar指令处理 

第一步:查看报信息

lipo -info libx.a

例如 输出结果:

Architectures in the fat file: libGeTuiSdk-1.4.3-noidfa.a are: armv7 i386 x86_64 arm64

如果提示fat file,那么代表这个包是支持多平台的,例如armv7,armv7s,i386等,这需要我们逐一做解包重打包操作。

第二步:创建文件夹

由于到合并多个包,所以需要先分好类后,再进行此操作

mkdir armv7

第三步:提取armv7平台的包

在第一步中,可以看到支持的各个平台。

lipo libx.a -thin armv7 -output armv7/libgt-armv7.a

第四步:解压.a文件

可以使用命令先进行查看.a包中的文件列表

ar -t armv7/libgt-armv7.a

解压.a包(内部都是.o文件)

cd armv7

ar xv libgt-armv7.a

第五步:删除冲突文件

针对minizip来说,我在个推包中,删除如下几个文件(可以手动在文件夹里删除)

rm zip.o

rm unzip.o

rm mztools.o

rm mztools.o

第六步:重新打包

删除后,重新把.o文件,打成.a包。(把里面原来的.a文件删除)

cd ..

ar crv libgt-armv7.a *.o

第七步:根据支持平台类型,重复以上的操作,直到全部平台都操作一遍。

第八步:合并.a包,并替换文件

把所有的处理好的所有 libgt-armv7.a libgt-arm64.a libgt-i386.a  libgt-x86_64.a 放到一个文件夹里 然后

cd ..

lipo -create libgt-armv7.a libgt-arm64.a libgt-i386.a  libgt-x86_64.a -output libGeTuiSdk-1.4.3-noidfa-nominizip.a

5.2如果比较少,可以尝试下边图片的操作--

duplicate symbols for architecture arm64 .a静态库冲突_第2张图片

你可能感兴趣的:(duplicate symbols for architecture arm64 .a静态库冲突)