objective-c – 为什么要在静态库中链接类别,需要-ObjC链接器标
关于苹果的这个技术问答:
http://developer.apple.com/library/mac/#qa/qa1490/_index.html
我认为编译器可以在编译时标记对类别定义的方法的调用(它知道它们是在一个类别中定义的,而不是主类,因为原型在@interface Class(Category)部分) – 因此可以构建一个表中的对象文件中的“外部类别方法”.然后,链接器在进行其正常链接后,应该能够连接/合并并处理来自所有对象的“外部类别方法”表,并在所有链接的框架/库/对象中查找匹配的类类别中的匹配符号,然后可以拉出那些还没有在目标中的那些. 必须有一些我失踪的东西,但它是什么呢?为什么这不可能? 解决方法
链接器将静态库像一个大的随机片段集合一样处理,它将从其中抽取单个片段来完成来自链接单元的其余部分的任何符号请求.
即如果主程序调用_foo和_foo只出现在静态库中,那么_foo以及任何从属符号将被拖入. 但是,当您调用类别中的方法时,由于Objective-C的活力,没有特定的符号引用. -ObjC标志告诉链接器,因为这样,它应该从静态库中抓取所有类别,并将’em’放入主二进制文件中. 这有点令人困惑,假设编译器应该更加聪明(而且确实应该在开发工具层面上提供帮助).记住几件事很重要: >在头文件中声明的任何东西在链接器滚动的时候都会丢失.符号由编译单元创建,而不是头文件.标题文件几乎产生了一个承诺,一个符号将被稍后或链接实现的具体创建,但是不能在自己内部创建一个符号(或者每个编译单元 – 每个.o – 将最终得到一个在链接时间会出现符号和兴趣. 最终结果? 链接器没有足够的信息来解析依赖关系. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |