iOS.StaticLibrary.1-avoid-duplicate-symbol-in-static-library[draft]
Avoid duplicate symbol in static library and its customer
发布static library给使用者使用。在实际的工程实践中,iOS静态库一般会在对外/对内提供SDK时出现。
静态库(SDK)本身可能依赖一些第三方的库,当使用该SDK的App也依赖了同样的第三方库,那么问题就来啦。
Figure: SDK 和 SDK Customer 依赖相同的3rd library

1. static library如何避免和使用者的代码有重复符号
Ref[1] Ref[4]
2. 从iOS的静态库中抽取出object file
Ref[5]
$ lipo libXXXSDK.a -thin armv7 -output libXXXSDK-armv7.a
$ ar -x libXXXSDK-armv7.a
3. 发布静态库
3.1 发布支持模拟器和真机的静态库
Ref[6] Ref[7]
3.2 debug编译和release编译的静态库区别
A: NSLog
debug: NSLog会输出
release: NSLog不会输出
3.3 如何strip静态库的符号表
A) 隐藏静态库的符号
Ref[17]
" Hiding internal names requires a few simple Xcode build settings, and it is not generally
necessary to modify source or change the type of the built product.
1. Eliminate any internal symbols required between modules by performing a single-object prelink.
Set the Xcode build setting named "Perform Single-Object Prelink" to Yes (GENERATE_MASTER_OBJECT_FILE=YES).
This causes ld to be run with the "-r" flag.
2. Make sure that the setting "Strip Style" is set to "Non-global symbols" (STRIP_STYLE=non-global), this passes "-x" to ld.
Stripping is only actually performed on static libraries if post-processing is enabled (and this is not the default).
3. Set Xcode build setting "Deployment Postprocessing" to yes. (DEPLOYMENT_POSTPROCESSING=YES).
Also make sure that "Use separate strip" is set to Yes (not always the default).
4. If, in addition to local symbols, if you need to remove some of the global symbols you can supply additional
options to the strip command, under the Xcode build setting "Additional strip flags". E.g. I commonly
use the strip "-R somefile" option to provide a file with an additional list of symbols which I want removed
from the global symbol table." Ref[17]
关于"STRIP_SYTLE" 参考Ref[19]
B) 将静态库的符号表剔除后, 会出现这种情况: 静态库出现crash时,无法将地址符号化。Ref[18]
C) 那么静态库的符号被strip掉后, 会不会像App被生成.dSYM文件呢? 或者其他类似的东西?
3.4 自动构建多architecture的静态库
Ref[15]
3.5 当发布商业的静态库时,选择debug configuration 还是release configuration呢?
Ref[16]
Reference
1. Avoiding dependency collisions in iOS static library managed by CocoaPods (AAAA+)
http://blog.sigmapoint.pl/avoiding-dependency-collisions-in-ios-static-library-managed-by-cocoapods/
https://github.com/jverkoey/nimbus/blob/master/scripts/generate_namespace_header
Bash, Perl or Sed, Insert on New Line after found phrase
http://stackoverflow.com/questions/6761796/bash-perl-or-sed-insert-on-new-line-after-found-phrase
2. Using Static Libraries in iOS
https://developer.apple.com/library/ios/technotes/iOSStaticLibraries/Articles/creating.html
3. UNIX ar Examples: How To Create, View, Extract, Modify C Archive Files (*.a)
http://www.thegeekstuff.com/2010/08/ar-command-examples/
4. Avoiding duplicate symbol errors during linking by removing classes from static libraries (ToRead)
http://atnan.com/blog/2012/01/12/avoiding-duplicate-symbol-errors-during-linking-by-removing-classes-from-static-libraries
5. Extract object (*.o) files from an iPhone static library
6. How to build a library for both iPhone simulator and device?
7. Build fat static library (device + simulator) using Xcode and SDK 4+
8. Distributing your Static Library
http://www.akitaonrails.com/2011/04/24/objective-c-distributing-your-static-library#.VZY4ShOqqko
9. Xcode 6 drops armv7s
https://www.cocoanetics.com/2014/10/xcode-6-drops-armv7s/
10. iOS Static Libraries Are, Like, Really Bad, And Stuff (ToRead)
http://landonf.org/code/ios/Radar_15800975_iOS_Frameworks.20140112.html
11. Strip debug symbol from universal static libraries (tested for iOS only)
https://gist.github.com/neonichu/1662881
12. An XCode project template to build universal frameworks (arm7, arm7s, and simulator) for iOS / iPhone.
https://github.com/kstenerud/iOS-Universal-Framework
13. http://www.raywenderlich.com/41377/creating-a-static-library-in-ios-tutorial (AAAA+)
14. strip nmeidt symbols: 编辑符号的工具
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/symbols.1.html
15. Automatic build of static library for iOS and many architectures (AAAA+)
http://blog.sigmapoint.pl/automatic-build-of-static-library-for-ios-for-many-architectures/
16. How to distribute Static libraries?
http://stackoverflow.com/questions/5730432/how-to-distribute-static-libraries/5778007#5778007
"So, long story short : just distribute a fat, release version of your library !"
17. strip symbol in static library
17.1 Symbol hiding in static libraries built with Xcode/gcc
17.2 Symbolification: Shipping Symbols
http://bdunagan.com/2010/05/15/symbolification-shipping-symbols/
17.3 How to solve symbolication problems --> "Build settings for getting proper symbol data"
http://support.hockeyapp.net/kb/client-integration-ios-mac-os-x/how-to-solve-symbolication-problems
17.4 xcode build settings for debug symbol
http://jonathanblog2000.blogspot.tw/2013/07/xcode-build-settings-for-debug-symbol.html
18. Symbolicating crash log for app with static library
19. Xcode Build Setting Reference
https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html
https://developer.apple.com/library/mac/technotes/tn2004/tn2123.html#SECNOSYMBOLS
iOS.StaticLibrary.1-avoid-duplicate-symbol-in-static-library[draft]的更多相关文章
- [问题]编译报错:clang: error: linker command failed with exit code 1及duplicate symbol xxxx in错误解决方法之一
今天添加了一个新类(包括m,h,xib文件),还没有调用,-编译遇到如下错误,根据错误提示, duplicate symbol param1 in: /Users/xxxx/Library/Devel ...
- [报错]编译报错:clang: error: linker command failed with exit code 1及duplicate symbol xxxx in错误解决方法之一
今天添加了一个新类(包括m,h,xib文件),还没有调用,—编译遇到如下错误,根据错误提示, duplicate symbol param1 in: /Users/xxxx/Library/Devel ...
- iOS开发 - OC - duplicate symbol _OBJC / undefind symbol 错误的相关处理
前言: 作为一个iOS开发,相信大家都会遇到类似于 “duplicate symbol” 的程序报错. 对于很多新手来说,可能会有点手足无措,因为这种类型的报错一般并非是代码的逻辑错误,大部分情况下是 ...
- iOS程序开发引用的第三方库之间出现duplicate symbol时的处理方法
iOS程序集成的第三方库过多时,很容易出现某几个库同时用到了一样的函数库,也就是在你的程序link时会提示duplicate symbol,而重复的符号又不是由你自己程序的代码造成的,也就说没法通过直 ...
- iOS开发 引用第三方库出现duplicate symbol时的处理方法
该篇文章是我自己从我的新浪博客上摘抄过来的, 原文链接为: http://blog.sina.com.cn/s/blog_dcc636350102wat5.html 在iOS开发中, 难免 ...
- 【原】IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
网上流传了太多关于合并lib库的方法,自己也尝试过,但大多失败.有感于这种急于解决问题,经过百般尝试后依旧无果的无奈心情,小翁在这里用一个实例来完整阐述如何在mac中合并lib静态库. 这里以移动广告 ...
- iOS 解决一个因三方静态库冲突产生的duplicate symbol的问题
最近在开发项目时编译三方.a时出现了冲突,原因是存在duplicate symbol. <1>模拟器编译时,应用的即时通讯模块采用的三方库(容联云),和视频监控模块采用的三方库(海康威视) ...
- 编译iOS程序时的-all_load选项,以及-all_load 导致的 ld duplicate symbol xx的问题
在新的SDK环境中调试百度地图的应用程序时,app总是意外退出,找了半天发现错误的原因是unrecognized selector xx的错误,另外还有报了一个Unknown class XXX in ...
- iOS开发- "duplicate symbol for architecture i386" 解决的方法
今天整合项目的时候, 遇到了这样一个问题. duplicate symbol _flag in: /Users/apple/Library/Developer/Xcode/DerivedData/bl ...
随机推荐
- 9、java中的final关键字
/* final : 最终.作为一个修饰符, 1,可以修饰类,函数,变量. 2,被final修饰的类不可以被继承.为了避免被继承,被子类复写功能. 3,被final修饰的方法不可以被复写. 4,被fi ...
- SilverlightOA源代码(可用于企业级Silverlight项目的二次开发,长年有效)
Silverlight OA系统简介 系统功能简介 l 程序界面介绍: 左侧为主菜单,主菜单可以展开和收起,主菜单下面的所有模块都可以在数据库中扩展增加,模块的权限和用户角色挂钩,可以在数据库中创建多 ...
- 堆外内存操作类ByteBuffer
本篇主要讲解如何使用直接内存(堆外内存),并按照下面的步骤进行说明: 1 相关背景-->读写操作-->关键属性-->读写实践-->扩展-->参考说明 希望对想使用直接内存 ...
- C 和指针 学习随便
---恢复内容开始--- 对NULL的解引用访问,有可能报错,有可能不会,取决于编译器 指针数组以一个NULL指针结束 ######################################## ...
- ACM博弈知识汇总(转)
博弈知识汇总 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻 ...
- (LinkedList)Intersection of Two Linked Lists
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- flex polygon 序列化为txt 文本
当我们要把一个地块导出为txt的时候,应该怎么写,这是比较有用的这样可以帮助我们存档之类的,这里是基于某个地方的独立坐标系,是基于自己发布地图,如果是用百度地图或者其他网上的地图可能不适用. pack ...
- 【练习】flashback基于scn的闪回查询
1.创建表dept1: :: SCOTT@ORA11GR2>create table dept1 as select * from dept; Table created. :: SCOTT@O ...
- C/C++中的指针数组和数组指针
1. 指针数组 定义:int *p[n],由于[]的优先级高于*,p和[]结合成一个数组,该数组的元素存储的是int类型的指针,由于数组内容是指针,因此p+1的步长是sizeof(int*),在32位 ...
- PHP获取日期
<?php echo "今天:".date("Y-m-d")."<br>"; echo "昨天:".d ...