博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转载:ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复
阅读量:5281 次
发布时间:2019-06-14

本文共 951 字,大约阅读时间需要 3 分钟。

转载自:http://www.cnblogs.com/dabaopku/archive/2012/12/12/2813940.html

问题

-all_load 是在Objective-C 编译时常用到的一个参数,比如这篇文章所介绍的,。但是我们在加入这个参数后,有时会出现“ld: duplicate symbol _main“的错误,比如 ,但是把 -all_load 参数从 Other Like Flags 里去掉后,编译虽然可以通过,但在运行时会崩溃。问题出在什么地方呢?

分析

参考 (需FQ,通过查看),, 等文章,我们可以大概知道 -all_load 的作用:

Objective C 中特有的语法特性 Category 大家肯定很熟悉,类似于C#中的扩展方法,可以在一个类的外面扩展这个类的功能,使得我们可以方便的为系统类添加自己的功能,比如为 NSString 添加 md5 编码。在编译到静态库时,这些代码模块实际上是存在不同的obj文件里的。程序在连接Category方法时,实际上只加载了Category模块,扩展 的基类代码并没有被加载。这样,程序虽然可以编译通过,但是在运行时,因为找不到基类模块,就会出现 unrecognized selector 这样的错误。

但是使用了 -all_load 之后,随之而来的问题就是,有的库里自作主张的定义了main函数,比如 libcurl.a。谁知道他们定义main函数是干什么的,但问题就是这个样子。因此,-all_load,加还是不加,这是个问题。

解决方案

有两个解决方案,其实都是寻找 -all_load 的替代参数。

苹果的官方文档里给了我们一个解决方案,使用 -ObjC 参数。它的文档说,-ObjC 参数会把所有的 Objective-C 代码模块加载,所以程序会有点臃肿;也许libcurl不是 Objective-C 实现的,所以不会加载。但相对于巨大的图片声音资源来说,程序稍微变大一点应该不算什么。

另外一个解决方案是 使用 -force_load 参数,可以参考 ,。我们可以只加载感兴趣的 静态库。

转载于:https://www.cnblogs.com/so-magic/p/3701665.html

你可能感兴趣的文章
Linux基础学习-数据备份工具Rsync
查看>>
HTML页面的导出,包括Excel和Word导出
查看>>
每日编程-20170310
查看>>
6.10—039—周一
查看>>
ORACLE ORA-01653: unable to extend table 的错误
查看>>
Config文件的使用:通过程序修改Config文件
查看>>
20-2 orm分组和聚合以及在项目中执行的一些方法
查看>>
屏蔽某些地区显示效果22
查看>>
枚举类型练习
查看>>
LeetCode--006--Z字型变换(java)
查看>>
Qt 中文问题
查看>>
【HANA系列】SAP HANA计算视图中的RANK使用方法
查看>>
MouseOver/MouseOut vs MouseEnter/MouseLeave
查看>>
使用web api开发微信公众号,调用图灵机器人接口(一)
查看>>
与HTTP协作的Web服务器
查看>>
(转)python time模块和datetime模块详解
查看>>
poj3255 Roadblocks 次短路
查看>>
Spring 3.0.5 MVC 基于注解ehcache.xml 配置方式
查看>>
Spark安装部署
查看>>
Environment.NewLine
查看>>