完美解决ios开发中两个.framework文件中.o文件冲突的问题(linker command failed with exit code 1 (use -v to see invocation)

项目中使用到XYPrinter.framework和Printer.framework中的两个.o文件有冲突, 查了资料通过拆分XYPrinter.framework删除其中冲突的.o文件,然后重新生成静态库, 解决了问题.

步骤如下:

  1. 新建一个文件夹resolveConflict, 将XYPrinter.framework复制到resolveConflict文件夹内.XYPrinter.framework内容如图, XYPrinter就是我们要拆分的文件

  1. 打开终端, cd到XYPrinter.framework下, 执行
$ lipo -info XYPrinter

终端会显示该库包含的cpu架构

Architectures in the fat file: XYPrinter are: armv7 i386 x86_64 arm64

这里介绍一下各类设备对应的cpu架构
模拟器包含的cpu架构:
iPhone 4s – iPhone 5 : i386
iPhone SE : x86_84
iPhone5s – iPhone 7 Plus : x86_64
真机设备包含的cpu架构
iPhone 3g – iPhone 4s : armv7
iPhone 5 – iPhone 5c : armv7s
iPhone SE : arm64
iPhone 5s – iPhone 7 Plus : arm64
只要支持了armv7就不用再支持armv7s

3 . 执行如下命令, 从XYPrinter中拆分出arm64架构对应的.a库并命名为XYPrinter_arm64.a

$ lipo XYPrinter -thin arm64 -output XYPrinter_arm64.a

然后同样的方法修改架构名拆分出其他3种cpu架构对应的.a库, 拆分完如下图

$ lipo XYPrinter -thin armv7 -output XYPrinter_armv7.a
$ lipo XYPrinter -thin i386 -output XYPrinter_i386.a
$ lipo XYPrinter -thin x86_64 -output XYPrinter_x86_64.a

  1. 将各个.a库拆分.o文件.最好每个架构的.a库都放到一个独立的文件夹中拆分, 不然4个架构的.a库拆分后所有的.o文件混在一起就乱了

在XYPrinter.framework根目录新建文件夹名为arm64, 将XYPrinter_arm64.a拖进该文件夹, 然后cd到arm64文件夹, 执行如下命令

$ ar -x XYPrinter_arm64.a

 

这样XYPrinter_arm64.a就被拆分成很多的.o文件. 在里面找到造成冲突的.o文件删除掉. 从第一张图的错误信息可以看出是FscBleCentralModel.o文件有冲突, 所以就把这个文件删了

第一张图中的错误信息里显示的只有arm64架构有冲突, 因为我是用真机测试的, 前面也介绍了各类设备对应的cpu架构, 所以要在模拟器或是其他设备上也能正常运行, 就需要把其他3个cpu架构的.a库重复这一步进行拆分并删除其中冲突的.o文件

  1. 然后就是把拆分后的文件重新生成.framework静态库. 在arm64文件夹里执行如下命令
$ libtool -static -o ../XYPrinter_arm64.a *.o

生成了一个新的arm64架构的.a库. 切换文件夹并重复该命令将被拆分的其他cpu架构的库重新生成.

  1. 将所有cpu架构的.a库进行合并. 需要先把XYPrinter文件删除掉, 因为合并之后的文件最好跟之前名字一样, 不影响正常使用. 删掉XYPrinter之后cd到XYPrinter.framework下执行如下命令
$ lipo -create -output XYPrinter XYPrinter_arm64.a XYPrinter_armv7.a XYPrinter_i386.a XYPrinter_x86_64.a

这样就把4个.a库合并成了名为XYPrinter的文件

  1. 最后恢复到第一步图中的结构, 把多余的文件都删掉就完成了 . 把新的XYPrinter.framework放到项目中, 再次运行就不会冲突了.
这个错误信息通常出现在使用`clang`编译器和`ninja`构建系统进行项目构建时。`clang`是编译器,负责将源代码编译成目标文件,而`ninja`是一个小型的构建系统,专注于速度,用于控制编译任务的执行。 错误信息“clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)”意味着链接器命令执行失败,并返回了退出代码1。链接器是用来将编译后的一个或多的程序目标文件(以及库文件)链接成最终可执行文件的工具。这个错误可能由多种原因造成,比如: 1. 缺少依赖库:可能是因为缺少某些必要的库文件或者没有正确设置链接器的搜索路径,导致链接器找不到需要链接的库。 2. 符号未定义:源代码可能引用了未定义的符号(函数或变量),或者定义了重复的符号。 3. 编译器/链接器版本不兼容:如果你的项目依赖于特定版本的库或编译器特性,而使用的版本不兼容,也可能会导致这个问题。 4. 编译选项错误:编译器或链接器的选项可能设置不正确,导致编译链接过程出现错误。 解决这个问题的步骤可能包括: 1. 确认项目依赖的库是否已经安装,并确保链接器能够找到这些库。 2. 检查源代码是否有未定义或重复定义的符号。 3. 检查是否使用了正确的编译器和链接器选项。 4. 如果使用了第三方库,确保其版本与项目兼容。 5. 查看更详细的编译和链接日志,通过`-v`参数查看更多编译命令的详细输出,这有助于诊断问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值