iOS中如何处理SDK中重复.o文件

 ###  iOS中如何处理SDK中重复.o文件
  1. 在iOS开发中经常会使用到第三方的SDK,有些SDK中有应用的相同的类,如下图所示:Demo工程中有A跟B两个静态库,A跟B中又有相同的YTLog类


    Demo工程目录
  2. 该Demo在编译时会报重复.o文件错误,报错如下图所示:


    Demo报错

ld: warning: directory not found for option '-L/Users/z_yt/Desktop/ /Personal_file/5/TestDemo/StaticLibraryDemo/Library'
duplicate symbol OBJC_CLASS$_YTLog in:
/Users/z_yt/Library/Developer/Xcode/DerivedData/StaticLibraryDemoWorkspace-byqglqkcbrjzljfrqjqzzmgrbuvz/Build/Products/Debug-iphonesimulator/libLibraryB.a(YTLog.o)
/Users/z_yt/Library/Developer/Xcode/DerivedData/StaticLibraryDemoWorkspace-byqglqkcbrjzljfrqjqzzmgrbuvz/Build/Products/Debug-iphonesimulator/libLibraryA.a(YTLog.o)
duplicate symbol OBJC_METACLASS$_YTLog in:
/Users/z_yt/Library/Developer/Xcode/DerivedData/StaticLibraryDemoWorkspace-byqglqkcbrjzljfrqjqzzmgrbuvz/Build/Products/Debug-iphonesimulator/libLibraryB.a(YTLog.o)
/Users/z_yt/Library/Developer/Xcode/DerivedData/StaticLibraryDemoWorkspace-byqglqkcbrjzljfrqjqzzmgrbuvz/Build/Products/Debug-iphonesimulator/libLibraryA.a(YTLog.o)
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

  1. 由报错的信息我们可以很明显知道LibraryA跟LibraryB中有相同的类冲突,解决这种冲突的最好方法肯定是把其中一个SDK中相同的类修改名称,但是实际开发中我们使用的SDK可能是没有源码,且也无法修改类名,这时可以通过删除相同的.o文件来解决这个问题;

  2. 使用lipo命令可以查看到LibraryA的信息,命令为 lipo -info libLibraryA.a,

    lipo查看SDK信息

    由图可以看出该SDK是no fat file,也就是只有x86_64模拟器版本,如果查看的结果为fat file,那么还需要做逐一解包的操作,操作命令为lipo LibraryA.a -thin armv7 -output userPath/xxx,userPath/xxx为你想存放的路径;

  3. 查看libLibraryA.a x86_64包中所包含的文件列表,其操作命令为ar -t libLibraryA.a

    libLibraryA.a x86_64包文件列表

由图中我们可以看到其中就有YTLog.o文件

  1. 从libLibraryA.a x86_64包中解压出所包含的文件,其操作命令为ar xv libLibraryA.a
    此处解压出来的文件是在你的当前路径下(pwd可查看你的当前路径),而不是libLibraryA.a所在的路径
    libLibraryA.a x86_64解压出objc file
  1. 删除YTLog.o文件,rm YTLog.o

  2. 重新打包.a文件,其操作命令为ar rcs libLibraryA.a *.o,执行完该命令则会生成一个新的libLibraryA库

  3. 如果你的库为fat file的话则每个平台的包都要执行上面6-8的动作,然后再执行合并各平台包的操作lipo -create libLibraryA-armv7.a libLibraryA-armv7s.a libLibraryA-i386.a -output libLibraryA.a

  4. 把重新打包出来的库导入工程中就可以正常运行起来了;

注意事项

  1. Demo工程中可能有人能够成功run起来而不用删除重复的.o文件,这是因为没有把两个sdk中的所有文件导入工程中,要把sdk的所有文件导入工程中要在工程的build Settings中设置Other Linker Flags,如图所示


    设置Other Linker Flags
  2. Other Linker Flags几个参数 -ObjC -all_load -force_load的意义

-ObjC:加了这个参数后,编译器会把静态库中所有的OC类和分类都导入到最后的可执行文件中。注意该参数的O是大写的。

-all_load:编译器会把所有找到的目标文件都加载到可执行文件中。该参数的出现的是为解决静态库中只有Category时,-Objc参数失效的bug。但正常情况下不要轻易使用该参数。要解决-Objc失效的问题也可以使用下面的参数-force_load

-force_load:所做的事情跟-all_load是一样的,但是-force_load要指定需要加载的静态库的文件路径,这中设置就可以仅仅完全加载一个库文件,而不影响其他静态库。

  1. 该方法只能删除名称相同且实现相同的类,加入该类仅仅是类名相同,但是实现不一样,这样删除任意一个类都会导致编译失败;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin/Al...
    一位先生_阅读 1,494评论 0 1
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,703评论 0 9
  • 课程小汇报 通过上节课的了解发现,同学们目前对基本形的把握还不够准确。而这一问题的缘由主要在于观察方式,所以需要引...
    范佳老师阅读 222评论 0 0
  • 日行一善签到 姓名 :张文达 (单位)哈尔滨中央红小月亮超市有限责任公司 【日精进打卡第28天】20180422 ...
    文达_心动驿站阅读 139评论 0 0
  • “李娜,听说了吗?以后二胎的产假延长了一个月。”同事小慧电话告诉李娜。 “不错啊,女人生孩子不容易,就该多休养一段...
    我爱健康阅读 260评论 1 2