ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复
2012-12-12 00:57
435 查看
问题
-all_load 是在Objective-C 编译时常用到的一个参数,比如这篇文章所介绍的,生成静态库的一些问题-all_load。但是我们在加入这个参数后,有时会出现“ld: duplicate symbol _main“的错误,比如 libCurl duplicate symbol,但是把 -all_load 参数从 Other Like Flags 里去掉后,编译虽然可以通过,但在运行时会崩溃。问题出在什么地方呢?分析
参考 Universal static library problem in iPhone SDK(需FQ,通过bing的cache查看),cocos2d for Mac,Building Objective-C static libraries with categories 等文章,我们可以大概知道 -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 参数,可以参考 Objective-C categories in static library,How can I avoid “duplicate symbol” errors in xcode with shared static libraries?。我们可以只加载感兴趣的 静态库。感谢神奇的 StackOverflow!相关文章推荐
- 转载:ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复
- ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复
- ios程序编译链接参数 all_load 的 ld duplicate symbol 的bug及修复
- 编译iOS程序时的-all_load选项,以及-all_load 导致的 ld duplicate symbol xx的问题
- 编译iOS程序时的-all_load选项,以及-all_load 导致的 ld duplicate symbol xx的问题
- solaris10g++编译程序链接时候报错symbol referencing errors
- 编译问题: "ld: duplicate symbol _OBJC_METACLASS_$_XXX..."
- GCC/LD编译链接潜规则 (第四弹) : ld 会把所有通过-l指定的动态库全部链接进最终的目标程序中, 无论是否真的用到(导致生产环境加载失败)
- 【安卓】iOS 程序开发引用的第三方库之间出现 duplicate symbol 时的处理方法
- iOS 使用CocoaPods升级百度地图Framewor后,出现 Showing All Messages ld: symbol(s) not found for architecture i386
- GCC/LD编译链接潜规则 (第五弹) : 为什么会有undified symbol?
- iOS程序开发引用的第三方库之间出现duplicate symbol时的处理方法
- keil5 编译程序出现错误Error: L6411E: No compatible library exists with a definition of startup symbol __main
- xcode上编译c语言程序报错:ld: x duplicate symbol for architecture x86_64 clang: error: linker command failed w
- IOS集成百度地图遇到问题ld: 1 duplicate symbol for architecture i386,clang: error: linker command failed with e
- iOS 编译含C++代码出现ld: symbol(s) not found for architecture i386错误之解决
- IOS编译错误:ld: symbol(s) not found collect2: ld returned 1 exit status
- iOS程序开发引用的第三方库之间出现duplicate symbol时的处理方法
- IOS开发之添加第三方lib或从其他工程引入lib时的链接错误:ld: symbol(s) not found for architecture i386
- vc++中的编译链接错误error link2001 unresolved external symbol _main解决办法