常见链接错误

常见链接错误

阅读原文

编译链接的时候报错,算是初学者遇到的比较头疼的问题之一了。现在总结一下,在项目中遇到了链接错误。

1.“OBJC_CLASS$_xx” 错误

Undefined symbols for architecture i386:
"OBJC_CLASS$_ASIdentifierManager", referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

分析:看错误提示,没有找到ASIdentifierManager这个文件,可能是我们没有倒入相关的框架,或者缺少相应的文件(头文件、实现文件等等)。

解决办法:我们需要看看工程中有没有相应的实现文件、头文件,或者看看有没有倒入相关的框架。
例如本例,缺少了相应的框架,导入AdSupport.framework ,编译成功。

2.“OBJC_CLASS$_xx” 错误

这个看起来跟第一个一样,但是我们把第一个错误中的解决办法都尝试了之后,发现还是编译不成功,这时候心中就一万匹草泥马,呼啸而过了。例如:

Undefined symbols for architecture x86_64:
"OBJC_CLASS$_PPAppPlatformKit", referenced from:
objc-class-ref in libPlugin25PP.a(IAPOnline25PP.o)
objc-class-ref in libPlugin25PP.a(PPWrapper.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

死活找不到原因,重新阅读,相关的接入文档,发现模拟器不能运行,只有真机才能运行。认真阅读接入文档很关键啊!!!

因此OBJC_CLASS$_xx” 错误,最后的解决办法,看看是否是要求只能在真机或者模拟器上才能运行。这类错误一般再介入别人的sdk的时候比较常见。

3.“duplicate symbol xx”错误

分析:字面意思,我们项目中的xx(文件名、类名、全局变量名称)有重复出现的情况。
解决办法: 仔细察看工程,删除或者修改,提示中出现的xx。
常见错误的情况:同时介入好几个sdk的时候,不同的sdkyou相同的文件名,类名,全局变量名等等。因此,制作sdk的时候,最重要的就是因该再我们的类中,文件中,统一加上前缀,防止别人使用的时候出现冲突。

常见链接错误_第1张图片
duplicate symbol xx 示例

4."clang: error: -fembed-bitcode is not supported on versions of iOS prior to 6.0" 错误

解决办法:解决办法:在build setting里面设置查找“enable_bitcode”,并且改为NO

5.运行时候崩溃。“Terminating app due to uncaught exception 'NSGenericException', reason: Collection <__NSArrayM: 0x615c6a0> was mutated while being enumerated”

原因: 遍历数组的过程中对它里面的数据进行了修改,不能使用for in 或者枚举器法 遍历(可以把遍历的结果保存下来,等遍历完成之后进行修改), 因该使用for循环来进行 。即,我们在遍历数组的时候,不能对它进行修改之类的操作,不然鬼知道会发生什么事情。(我理解的大概就是这个意思)

6.在使用c++ 的string类的时候,出现链接错误:

string_link_error.png

分析:看样子是直接找不到std::string 这个用法了,在我的调用string类的方法中,说明使用的这个string库有问题。所以尝试解决一下Xcode工程中配置的c++ 的标准库.

解决办法:在当前工程的TARGET中在Build Settings搜索lib , 找到C++ Standadr Libary ,libc++(支持c++11的那一个),有时候可能是Compiler Default。然后问题完美解决!

7.Symbol not found: _ NSDictionary0 ___

Referenced from:
/private/var/mobile/Cotainers/Bundle/Applecation/xxxxxx

Expected in:
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
in /private/var/mobile/Containers/Bundle/Applecation/xxxxx

Symbol not found.png

分析:工程中找不到相应的系统库,可能发生在工程运行在较低版本的手机系统中,会报错。

解决办法: 首先查看,工程中有没有添加CoreFoundation.frameowrk ,这个动态库,如果有的话,可以尝试把CoreFoundation.framework 的Status由Required改为Optional

未完待续,希望小伙伴们继续补充!

你可能感兴趣的:(常见链接错误)