zoukankan      html  css  js  c++  java
  • Oc 编译错误、符号与链接、加载

    Oc 编译错误、符号与链接、加载

    oc 语言只在编译时进行符号声明存在检查,不存在链接阶段的解析

    No visible @interface for ‘xxxx’ declares the selector 'hello'

    除了提供在其他面向对象语言中已有的多数抽象和机制之外,Objective-C 还是一种非常动态的程序设计语言,而且这种动态是其最大优势。这种动态体现在它允许在运行应用程序时(即运行时)才去确定其行为,而不是在生成期间就已固定下来。因此,Objective-C 的动态机制让程序免受约束(编译和链接程序时施加的约束);进而在用户控制下,将大多数符号解析责任转移到运行时。

    https://developer.apple.com/library/archive/referencelibrary/GettingStarted/RoadMapiOSCh-Legacy/chapters/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

    -force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。

    在Xcode工程的Other linker flags中添加-ObjC 标志可以解决使用静态库中的category时出现unrecognized selector的问题。

    UNIX的静态库(xxx.a)其实就是一个目标文件(xxx.o)的集合。在C语言中,编译一个源文件时如果遇到在其他文件中定义的函数,则会留下一个 undefined symbol。在链接时会通过找到其他文件中的定义来确定这个symbol。

    在Objective-C中,由于方法调用都是在运行期确定的,因此没有针对方法的symbol,只有针对类的。

    这样在静态库中如果使用了category扩展已有的类,编译器不知道如何将category和已有的类整合在一起,就会导致unrecognized selector问题。添加-ObjC标志后,编译器会把一个类相关的所有目标文件都加载,这样就解决了这个问题。但是由于这样做会使可执行文件体积变大,所以没有设为默认选项。

    ————————————————

    版权声明:本文为CSDN博主「Lonely_Devil」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/Lonely_Devil/article/details/50907781

    ------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。
  • 相关阅读:

    bzoj3052: [wc2013]糖果公园
    莫队算法心得
    bzoj1104: [POI2007]洪水pow
    bzoj1102: [POI2007]山峰和山谷Grz
    bzoj1121: [POI2008]激光发射器SZK
    bzoj1113: [Poi2008]海报PLA
    bzoj1103: [POI2007]大都市meg
    bzoj1396: 识别子串
    bzoj3756: Pty的字符串
  • 原文地址:https://www.cnblogs.com/feng9exe/p/14852504.html
Copyright © 2011-2022 走看看