linker command failed with exit code 1 (use -v to see invocation)
iOS开发中遇到上面编译链接错误,无疑是最头疼的,基于自己踩过的坑,记载下来,供人参考。
一、当编译链接错误上方有提示:ld: "xx" duplicate symbol 错误
出现这种错误,首先查看是不是自己项目文件重复导入了,但这种都很容易查找看出,若是没有,那多半是导入的多个第三方SDK编译链接时产生的冲突问题。这时请根据自己的项目情况修改链接参数(Other Linker Flag)。
Other Linker Flag链接填写的参数有这三种。
1.-ObjC
这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大(因为加载了其他的objc代码进来)。但是如果静态库中有类和category的话只有加入这个flag才行。
2.-all_load
这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load。-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。
(PS:出现错误的原因是不是项目就是用了这个flag呢!建议换成下面的flag尝试下)
3.-force_load
这个flag所做的事情跟-all_load其实是一样的,只是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载
使用格式:-force_load(空格) $(SRCROOT)/路径/静态库.a
{来自参考:https://www.jianshu.com/p/7579eda7cbef,https://blog.csdn.net/ouyangtianhan/article/details/41007771}
二、当编译链接错误上方有提示:Undefined symbols for architecture i386 (x86_64)错误
架构是神马东东?CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。模拟器上的架构和真机上的架构是不一样的,模拟器和模拟器之间,真机和真机之间的架构也是不同的。如果静态库的架构和测试项目对应的模拟器或真机上的架构不对应就会报“未定义的符号XXX架构”, 由此可以得出模拟器上的静态库!
让静态库支持所有模拟器对应的架构
Build Settings -> Build Active Architecture Only(只构建活跃的架构)-> NO
{来自参考:https://blog.csdn.net/liangliang2727/article/details/52941394}
三、当编译链接错误上方有提示:ld: -no_pie and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together 错误
Build Setting -> Enable Bitcode -> NO
============================================
要是有人遇到过其他链接错误并知道解决的,欢迎在评论区contribute~。