• 编译iOS程序时的-all_load选项,以及-all_load 导致的 ld duplicate symbol xx的问题


    在新的SDK环境中调试百度地图的应用程序时,app总是意外退出,找了半天发现错误的原因是unrecognized selector xx的错误,另外还有报了一个Unknown class XXX in Interface Builder file的错误,找了一下百度官方的资料,官方建议是app的Build Settings中的Other Linker Flags中增加-all_oad选项,但是我的app中还连接了其他静态库,加了这个选项之后,编译的时候报了 ld duplicate symbol xx的错误,于是又去苹果官网找了一下资料,发现有个类似功能的选项-ObjC,在编译选项中将-all_load改为-ObjC后,app编译和运行正 常,附上apple官方的介绍:

    https://developer.apple.com/library/mac/#qa/qa2006/qa1490.html

    官方的说明是app中链接的静态库中使用了Category(类别),在编译到静态库时,这些代码模块实际上是存在不同的obj文件里的。程序在连 接Category方法时,实际上只加载了Category模块,扩展的基类代码并没有被加载。这样,程序虽然可以编译通过,但是在运行时,因为找不到基 类模块,就会出现unrecognized selector 这样的错误。-all_load就是解决上述问题,类似的还可以用-force_load、-ObjC。 再附上一个相关的资料:

    http://stackoverflow.com/questions/2300867/how-can-i-avoid-duplicate-symbol-errors-in-xcode-with-shared-static-libraries/2300873#2300873

     另外一种解释方式:

    -ObjC

    这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大(因为加载了其他的objc代码进来)。但是如果静态库中有类和category的话只有加入这个flag才行。

    -all_load

    这个flag是专门处理-ObjC的一个bug的。用了-ObjC以 后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force- load。-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。-force_load在xcode3.2后可用。但是 -force_load后面必须跟一个只想静态库的路径。

  • 相关阅读:
    Git push 出现 refusing to merge unrelated histories
    The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.
    Linux离线安装docker&docker-compose
    mybatis新增记录使用 useGeneratedKeys无法返回主键
    Docker 修改容器内的时区
    快排写法
    c++学生信息管理系统(window控制台实现鼠标点击操作)
    洛谷P1006 传纸条(多维DP)
    二维bit模板
    一个milller_rabin模板
  • 原文地址:https://www.cnblogs.com/jgCho/p/5199834.html
Copyright © 2020-2023  润新知