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

如果是有些库使用到了扩展函数(catagory)可以分别对这个库进行加载

使用:-force_load

-force_load BaiduMapApi/libs/Release-iphoneos/libbaidumapapi.a

(BaiduMapApi是添加到当前目录下的)

-force_load $(BUILT_PRODUCTS_DIR)/libxxx.a

(这里是直接添加静态库项目源码的做法)

使用-force_load分别进行加载还是蛮方便的,如果有些函数加入了main函数使用all_load就相当麻烦了。

以上可以解决TencentOpenAPI.framework与ZbarSDK的冲突

如果两个静态库冲突的结构是相同的,可以考虑将两个静态库拆分出来进行合并。

查看文件的架构有哪些
$ lipo -info libzbar.a
Architectures in the fat file: libzbar.a are: armv7 (cputype (12) cpusubtype (11)) i386

将armv7解压出来

lipo libzbar.a -thin armv7 -output libzbar-armv7.a

新建立一个文件夹出来存放解压的(.o)文件
$ mkdir armv7
$ cd armv7

将静态库中的文件解压

$ ar -x ../libzbar-armv7.a

然后将另一个静态库根据以上的步骤做一遍,然后观察连个解压的静态库中,有那些是一样的就合并在一起,不过注意的是两个静态库冲突的(.o)文件必须一致,否则也会出现错误。

合并完后进行打包了
$ libtool -static -o ../libnew-armv7.a *.o

如果像在虚拟机也使用,进行相同的步骤后,将i386的架构合并再一起就可以了。

合并静态库
$ lipo -create -output lib.a libnew-armv76.a libi386.a

时间: 2024-12-10 00:03:12

iOS解决两个静态库的冲突 duplicate symbol的相关文章

IOS 合成两个静态库方法

mactekiMacBook-2:he mac$ lipo -create libbaidumapapi1.a libbaidumapapi2.a -output libbaidumapapi.a 三个文件均在同一文件夹下. 若在不同文件夹内,则需要填完整地址才能找到合成如lipo -create XXX/XXX/XXX/libbaidumapapi1.a YYY/YYY/YYY/libbaidumapapi2.a -output ZZ/ZZ/ZZ/libbaidumapapi.a X与Y为输入

iOS开发拓展篇—静态库

iOS开发拓展篇—静态库 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking (2)闭源库 不公开源代码,是经过编译后的二进制文件,看不到具体实现 主要分为:静态库.动态库 二.静态库和动态库 1.静态库和动态库的存在形式 静态库:.a 和 .framework 动态库:.dylib 和 .framework 2.静态库和动

转载: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"的错误

iOS实用技能扩展-静态库的制作与简单使用

前言:此文是关于静态库的概念描述,如何制作及简单调试使用,不同版本的说明与场景使用. 1.关于库的简介: 库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking 闭源库 不公开源代码,是经过编译后的二进制文件,看不到具体实现 主要分为:静态库.动态库 2.静态库的特点:.a+.h; 为什么制作闭源库 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用 例如:百度地图,友盟,JPush等 在

ios开发中创建静态库的方法介绍

在进行iOS项目开发时,为了减少项目的编译时间,通常情况下会把项目中的私密内容打包成静态库,或者是把ios项目中变动较少一部分打包成静态库以便提高编译效率,很多iOS初学者对静态库与动态库的区别及创建使用,下面就一起来学习下: (一)iOS静态库.动态库与Framework静态库与动态库的区别: (1)什么是库? 库(Library)直白一点说就是一段编译好的二进制代码,加上头文件就可以供别人使用;(例如: iOS中Objective-C编译下的.h和.m文件,打包静态库后会变为.h和.a文件)

iOS开发,如何打包静态库.a文件

1.需求 我们在开发iOS的工作中可能会自己开发一些.a静态库或者打包一下别人的第三方类库包装成自己的.a文件.有时候我们引入一些C++编译的第三方文件时可能会出现编译的错误,但是我们如果打包成.a静态库时就很少会出现OC与C++混编的错误,原因很简单.a静态库文件是编译好的二进制文件,二进制文件与二进制文件互相混编当然没有什么问题.好那么接下来我们开始学习打包吧! 2.实例 接下来我们就以打包IOS开发中常用的网络请求库AFNetworking为实例. 1>我们需要准备好需要打包的AFNetw

iOS如何重新打包静态库,使得模拟器和真机都可以使用(以ZBarSDK为例)

ZBarSDK下载地址:https://github.com/bmorton/ZBarSDK http://zbar.sourceforge.net/iphone/index.html 1.创建工程 导入ZBar的SDK文件.即把ZBarSDK的目录拉入项目,然后选中copy选项 2.添加framework 3.添加代码 #import "ZBarSDK.h" #import "QRCodeGenerator.h" @interface yxpViewControl

解决jQuery和其他库的冲突

本文摘自<锋利的jQuery> 在jQuery库中,几乎所有的插件都被限制在它的命名空间里.通常,全局(global)对象都被很好地存储在jQuery命名空间里,因此当把jQuery和其他JavaScript库(例如Prototype.MooTools或YUI)一起使用时,不会引起冲突. 注:默认情况下,jQuery用$作为自身的快捷方式. 1.jQuery库在其他库之后导入 在其他库和jQuery库都被加载完成后,可以在任何时候调用jQuery.noConflict()函数来将变量$的控制权

【iOS开发-115】静态库的制作以及第三方框架iOS Universal Framework,DEBUG和RELEASE

(1)概念介绍 --我们平时在项目中用的最多的就是开源的第三方库,这种库是开源的,我们不仅能用,还能查看源代码甚至可以修改源代码. --与开源库对应的就是闭源,闭源库分为动态库和静态库.动态库就是.dylib或者.framework结尾的文件.就是苹果官方提供给我们用的那些库.开发者不能在项目中使用自制的动态库,否则无法上传到APPStore. --所以,对于闭源库,我们主要讨论的是静态库.静态库的样子就是用户拿到的文件有很多头文件.h+资源包+编译过的一个二进制文件.a(.framework)