使用Reveal.app调试整个项目UI时间,增加LD指令 -Objc引起项目中多个静态库冲突问题

今天接触到一个新的UI调试工具教程如下:

iOS真机UI调试利器——Reveal

引入增加-ObjC -framework Reveal指令后,发现项目出现多重静态库冲突问题,

首先介绍一个指令:

-all_load选项,这会导致所有的类的方法都会被载入,不管“你的程序”有没有用到,所有的,包括系统的,方法会被载入。这个方法不仅会导致你的目标程序大小增大,而且往往容易引起一些冲突,而这些冲突往往你无法解决(常常出现在你链接的各种库中)。

可以使用-force_load,这个你可以指定要载入所有方法的库,这个算一个还不错的解决方法,但是仅在Xcode3.2之后才支持

场景:

解决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

时间: 2025-01-05 03:11:13

使用Reveal.app调试整个项目UI时间,增加LD指令 -Objc引起项目中多个静态库冲突问题的相关文章

[转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)

本文转自:http://kb.cnblogs.com/page/94467/ Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用. 首先下载Openssl包:(http://www.openssl.org/),这是一个C语言类库包,在Windows下可以通过Perl对该类库包进行MakeBuild,产生libeay32.ssleay32的Lib以及Dll文件,具体操作详见:h

iOS项目引用静态库文件.a

由于开发的项目中使用了静态库文件(.a文件),因此专门对它进行了简单的学习.静态库文件包装的是经常使用的公共代码,便于代码的复用. 1.生成静态库文件(static library file).主要包括以下几个主要步骤: (1)创建静态库项目 命名为Stone,并在生成的Stone类里面添加一个类方法+printInfo,如图: 未编译前,Products文件夹下的libStone.a是红色的,编译之后变为黑色,如图: 注意顶部选择"iOS device"生成用于真机的静态库文件,选择

ios 利用Reveal来调试界面1 --模拟器(步骤详解)

Reveal是一个程序界面调试工具,可以调试iOS apps和tvOS apps.使用Reveal,我们可以在开发时动态地查看和修改应用程序的界面.避免每次修改UI的时候都要重新运行程序.接下来按照规矩,如下图,能用 图说明清楚的就不用文字来表达了,文字的表现力不够直观. Reveal程序运行截图 1.如“Reveal程序运行截图”所示,我使用的Reveal官方提供的项目来 作为调试Demo,最左边的是Demo的在模拟器的运行效果,右边的App就是Reveal,我第一眼看到这个Reveal有种惊

ios 利用Reveal来调试界面2--真机调试(步骤详解)

使用真机调试我们的App界面,如果你的真机是没有越狱的设备,那么使用Reveal来调试UI的步骤是最麻烦的. 打开Reveal的库位置 取Reveal的库 拖库进项目 1.如“拖库进项目”图所示,把Reveal的库拖到我们项目中来. 选择添加的方法 2.如“选择添加的方法”所示,不要把库加到我们App的target里面. 添加到Bundle Resource 3.如“添加到Bundle Resource”图所示,将Reveal的库添加到Bundle Resource. 选择添加到Bundle R

app开发周期一般多长时间?【专业分析】

在外包app之前,很多朋友会问做一款app大概需要花费多长时间,但这个问题实际上是没有标准答案的.因为每款app的功能需求都不一样,而功能需求是决定app外包开发时间的最重要因素,功能越简单越少,开发时间自然就短.所以想要知道app开发周期一般多长时间,首先要明确你的功能需求才能够进一步判断,然而这个周期我们是没法改变的.当然除了app本身的功能需求之外还有一些人为的主观因素可能会影响到app的外包时长,今天我们就来谈谈这个. 第一,App开发进度表 项目开始前一定要求乙方(app开发商)提供开

[Android Memory] App调试内存泄露之Context篇(下)

转载地址:http://www.cnblogs.com/qianxudetianxia/p/3655475.html 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncTask等系统自带类去做事情,当然无可厚非. 但是AsyncTask确实需要额外注意一下.它的泄露原理和前面Handler,Thread泄露的原理差不多,它的生命周期和Activity不一定一致. 解决方案是:在activity退出的时候,终止AsyncTask中的后台任务. 但是,问题是如

【Android】开源项目UI控件分类汇总之Dialog

接前文ProgressBar:Android开发的宝库越来越多,我开发中有需要的组件,主要参考Trinea的大作Android开源项目分类汇总(包含了后面的绝大多数).CSDN上直接拿来用!最火的Android开源项目还有CSDN上的直接拿来用!十大Material Design开源项目,受益匪浅,但是,有的分类项目太多,不是每个项目都有预览,不容易找到什么是最想要的,而且有一些项目不容易顺利地导入,我把同类的Demo做到一个app里,供大家下载参考.本文介绍几种Dialog.Dialog相关的

【Android】开源项目UI控件分类汇总之ProgressBar

Android开发的宝库越来越多,我开发中有需要的组件,主要参考Trinea的大作Android开源项目分类汇总(包含了后面的绝大多数).CSDN上直接拿来用!最火的Android开源项目还有CSDN上的直接拿来用!十大Material Design开源项目,受益匪浅,但是,有的分类项目太多,不是每个项目都有预览,不容易找到什么是最想要的,而且有一些项目不容易顺利地导入,我把同类的Demo做到一个app里,供大家下载参考.不过顺序没有按Trinea的大作来,当下需要什么控件,就优先写哪些,先从最

iOS中web app调试(mac).md

目录 一.真机联调配置 二.mac上Safari配置及真机联调 三.iOS模拟器使用 四.在iOS模拟器中安装app 近期公司vue项目开发,目的是一次开发,多平台发布,其中就包含了app,app采用离线web方案,将vue打包后的js bundle文件.静态资源文件打包进app中,为提高性能.优化体验,app也通过jsbridge,暴露原生接口给web调用. 为此,web app开发时可以使用chrome等pc模拟器进行调试,但是涉及app适配,特别是原生接口调试时,就比较麻烦,必须要依赖于真