C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了objective-c – 为什么要在静态库中链接类别,需要-ObjC链接器标志? (LLVM)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
关于苹果的这个技术问答: http://developer.apple.com/library/mac/#qa/qa1490/_index.html

我认为编译器可以在编译时标记对类别定义的方法调用(它知道它们是在一个类别中定义的,而不是主类,因为原型在@interface Class(Category)部分) – 因此可以构建一个表中的对象文件中的“外部类别方法”.然后,@L_197_8@器在进行其正常@L_197_8@后,应该能够连接/合并并处理来自所有对象的“外部类别方法”表,并在所有@L_197_8@的框架/库/对象中查找匹配的类类别中的匹配符号,然后可以拉出那些还没有在目标中的那些.

必须有一些我失踪的东西,但它是什么呢?为什么这不可能?

解决方法

@L_197_8@器将静态库像一个大的随机片段集合一样处理,它将从其中抽取单个片段来完成来自@L_197_8@单元的其余部分的任何符号请求.

即如果主程序调用_foo和_foo只出现在静态库中,那么_foo以及任何从属符号将被拖入.

但是,当您调用类别中的方法时,由于Objective-C的活力,没有特定的符号引用.

-ObjC标志告诉@L_197_8@器,因为这样,它应该从静态库中抓取所有类别,并将’em’放入主二进制文件中.

这有点令人困惑,假设编译器应该更加聪明(而且确实应该在开发工具层面上提供帮助).记住几件事很重要:

>在头文件中声明的任何东西在@L_197_8@器滚动的时候都会丢失.符号由编译单元创建,而不是头文件.标题文件几乎产生了一个承诺,一个符号将被稍后或@L_197_8@实现的具体创建,但是不能在自己内部创建一个符号(或者每个编译单元 – 每个.o – 将最终得到一个在@L_197_8@时间会出现符号和兴趣.
Objective-C是完全动态的.当你说[(id)foo bar]时,唯一的要求是该条在某个地方被定义.如果它实际上是完全实现的(直到运行时),这并不重要.
>类别不必具有相应的@implementations;可以使用类别来声明方法可能存在,实际上在将@optional添加到@protocol之前,通常在NSObject(ewwww)上使用没有@implementation的类别来表示“嘿,这个可选方法可能存在于运行时“.
>编译和@L_197_8@是完全独立的过程.编译是关于扩展代码并将其转换为可执行字节库.@L_197_8@是关于使用这些库并把它们放在一起可以实际运行的东西,包括解决库之间的所有依赖关系.编译器并不知道有什么可能被@L_197_8@,并且@L_197_8@器没有关于可能定义了哪些东西(没有产生硬符号)的信息.

最终结果?

@L_197_8@器没有足够的信息来解析依赖关系.

大佬总结

以上是大佬教程为你收集整理的objective-c – 为什么要在静态库中链接类别,需要-ObjC链接器标志? (LLVM)全部内容,希望文章能够帮你解决objective-c – 为什么要在静态库中链接类别,需要-ObjC链接器标志? (LLVM)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。