zoukankan      html  css  js  c++  java
  • 使用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
  • 相关阅读:
    (转)【web前端培训之前后端的配合(中)】继续昨日的故事
    ural(Timus) 1136. Parliament
    scau Josephus Problem
    ACMICPC Live Archive 6204 Poker End Games
    uva 10391 Compound Words
    ACMICPC Live Archive 3222 Joke with Turtles
    uva 10132 File Fragmentation
    uva 270 Lining Up
    【转】各种字符串哈希函数比较
    uva 10905 Children's Game
  • 原文地址:https://www.cnblogs.com/ccguo/p/4076676.html
Copyright © 2011-2022 走看看