转载:ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复

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


ios程序编译链接参数
all_load 的 ld duplicate symbol _main 的 bug及修复


问题


-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
(需翻墙,通过bing的cache查看),cocos2d for MacBuilding
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?
。我们可以只加载感兴趣的 静态库。

转载:ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的
bug及修复,码迷,mamicode.com

转载:ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的
bug及修复

时间: 2024-10-12 22:38:28

转载:ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复的相关文章

iOS duplicate symbol _main in:问题解决

今天手贱给自己挖了个坑,由于工程中一些文件是后台的小伙伴写的C/C++文件,所以我一次性全部导入了,但是编译时出现了duplicate symbol _main in: A.o和B.o的编译错误. 下面写一个最简单的Demo还原这个情景. 新建一个工程,再新建Hello.h和Hello.c文件,代码如下: Hello.h #ifndef __Main__Hello__ #define __Main__Hello__ #include <stdio.h> int main(); #endif /

【C程序编译链接】gcc使用命令介绍

1.gcc或者g++安装rpm -qa|grep gcc ==>检查gcc是否安装gcc -v ==>检查gcc版本 编译器会在可执行文件中植入一些信息,可执行文件会变大.一般开发时候使用 -g ,编译一个 "release 版本" 时不使用 -g 编译. gcc如果是最新的则不重新编译链接. cc -c main.c 等同于cc -c main.c -o main.o 等同于 cc -c -o main.o main.c IDE:codeblocks中运行C语言程序 参考

iOS程序编译打包的两种方式

这个选项其实是用来设置我们要如何打包我们的代码. Architectures: 项目要编译的目标设备列表, 设置以哪种方式打包我们的代码 第一种方式: 包含两种架构的代码包(32bit, 64bit), 但是这种打包方式只能运行在iOS6以上的系统, 也就是说这种打包方式, 对手机没有要求, 只是对系统有要求. 第二种方式: 只包含一种架构的代码(32bit), 这种打包方式, 对于手机和系统都没什么要求, 但是这样会降低64位系统的手机性能 如果要兼容iOS5以及更低的系统, 只能打32位的包

iOS解决两个静态库的冲突 duplicate symbol

http://blog.163.com/023_dns/blog/static/118727366201391544630380/ 场景: 解决TencentOpenAPI.framework与ZbarSDK中  _base64_encode 函数的冲突 后来在网络上搜寻,删除掉 Other Linker Flag 的 -all_load 就可以解决静态库冲突的问题, 但是这样做的话,会使一些外部的静态库,使用objc扩展函数(catagory)的方法失效.例如BaiduMapApi 如果是有些

【iOS】编译静态库

与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图sdk),商用库,这两天在研究iOS上编译静态库,这里把编译的过程和中间遇到的一些问题做一下记录,方便以后查阅 objc上的库一般分为两类 静态库: .a 和 .framework .a文件:纯二进制文件,需要配合.h文件一起使用,通过.h文件引用库里面的内容 .framework文件:包含二进制文件

C++常见gcc编译链接错误解决方法

除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词): 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库,使用示例:-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest("-Wl"表示是传递给链接器ld的参数

iOS开发 - OC - duplicate symbol _OBJC / undefind symbol 错误的相关处理

前言: 作为一个iOS开发,相信大家都会遇到类似于 “duplicate symbol” 的程序报错. 对于很多新手来说,可能会有点手足无措,因为这种类型的报错一般并非是代码的逻辑错误,大部分情况下是在编译过程出错导致的,因此相对来说排查不易.在前几天,我在引用了两个SDK的过程中出现了这个问题,运用不同的手段最终解决了这个问题.今天本文就这个错误进行一个详细的分析以及如何处理做一个探讨,如果有错误的地方还请指出. 一.duplicate symbol /undefind  symbol出现的原

深入浅出-iOS程序性能优化 (转载)

iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象. iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象.还记得12306么,那个速度,相信大家都受不了.为了提高 iOS 的运行速度,下面我将抛砖引玉介绍一些我实践过的用来提供iOS程序运行效率的方法,与大家分享,希望能得到更多的反馈和建议.

用CocoaPods做iOS程序的依赖管理(转载)

原文链接:http://blog.devtang.com/blog/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/ 用CocoaPods做iOS程序的依赖管理 MAY 25TH, 2014 文档更新说明 2012-12-02 v1.0 初稿 2014-01-08 v1.1 增加设置 ruby 淘宝源相关内容 2014-05-25 v2.0 增加国内 spec 镜像.使用私有 pod.podfile.lock.创建 spec 文件等内容