




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
福利贴:资深攻城狮教你如何缩短开发周期文/李强一、 问题引入在当下的开发中,应用的功能做的越来越复杂,工程也越来越大,所以为了尽可能缩短开发周期,不可避免的会用到许多第三方库,随之而来的也会遇到好 多问题。比如,程序调用函数 funa,funa 函数从在于两个库 liba.a,libb.a 中,并且程序执行需要连接这两个库,那么程序执行时是调用 liba.a 中 funa 还是调用的 libb.a 中的 funa 呢?其实这个取决于链接时的顺序,比如先链接的 liba.a,这个时候通过 liba.a 的导出符号表就可以找到 funa 在 liba.a 中定义,并加入符号表中;链接 libb.a 的时候发现符号表已经存在 funa,就不会再次更新符号表,所以调用的始终是 liba.a 中的 funa 函数。这里的调用严重的依赖于链接库加载的顺序,很大程度上会导致混乱。作为 SDK 的提供者,我们尤其要避免这点。正常我们使用的库中包含了好多符号信息,如图 1 所示:图1这些符号信息有以下几个弊端:1、增大了库的体积;2、隐蔽性较差;3、容易带来冲突。 在开发过程中第三点带来的问题尤其严重,特别是当我们提供的 SDK 用到第三方库的时候(因为使用我们 SDK 的客户也有可能用到跟我们一样的第三方库)。二、 解决办法1、对第三方库处理下面继续以 x264(下文以 libx264.a 带过)为例说明如何编译第三方的库。 没有隐藏符号的第三方库如“图 1”所示,函数前面会带有 external 的标示。在最终对外发布的 SDK 中_x264_predict_16x16_dc_c 还是打着 external 的标签, 及对外可见。如图 2 所示:图2隐藏符号后,在 libx264.a 中,原先打上 external 标签的函数,会以 private external 标识。如图 3 所示:图3那么如何才能得到我们想要的、打上 private external 标签的库呢,有两种方 法可以做到。1)对每个函数加属性 _attribute_(visibility(“hidden”) void funa_hidden() printf(“hidden symboln”); void funa_visible() printf(“exported symbol”); 这样做的好处是可以根据需要对每个函数做定制处理。但若我们用到的三方 库代码量大,这种方法就是费时费力了。2)编译库时统一处理利用 gcc 的扩展属性,编译库时加上-fvisibility=hidden。 a) 静态库gcc static o libtest.a fvisibility=hidden c test.cb) 动态库gcc dynamic o libtest.so fvisility=hidden c test.c其中 dynamic 为 clang 的写法,大部分 gcc 写法为 shared。上边两种方法只处理了 c/c+,因为语法问题,汇编需要做特殊里,但也是 在函数头加属性,但它的属性写法为.private_extern。.macro function name, export=0, align=2 .macro endfuncELF .size name, . - name FUNC .endfunc.purgem endfunc .endm.text.align align .if export.global EXTERN_ASMnameELF .type EXTERN_ASMname, %function FUNC .func EXTERN_ASMname EXTERN_ASMname:.private_externEXTERN_ASMname.elseELF .typeFUNC .func name:.endif .endmname, %function name因为需要处理的汇编文件较少,所以对汇编采用了直接编辑源文件的方法。 其实个人觉得也应该能在编译时做统一处理,有兴趣的可以自己找一下方法。2、对 xcode工程的处理对 xcode 工程处理相对直观、简单了许多。只需在工程的设置里做如下处理。.1) 打开工程设置,跳转到 build setting 页面;.2) 搜索 hidden;.3) 将 Symbols Hidden by Default 设置 Yes;图4其实通过观察编译的过程可以发现,通过上述设置,苹果最终将其转化为步骤 1 的命令进行编译。编译的结果也是在库里加了 private external 而已。3、符号剥离最后一步,也是最关键的一步,就是真正将步骤 1 或步骤 2 中打上 private external 标签的函数做最终的处理,把它们从要发布的库里剥离。1) 首先设置 prelink在 target 的 build setting 里搜索 prelink,将 Perform Single-Object Prelink 置为Yes,然后把该工程需要的库都直接拖到 Prelink libraries 中。如图 5 所示:图5将 Deployment Postprocessing 置为 Yes。如图 6 所示:2) 设置 post process图6将 Strip Style 设置为 Non-Global Symbols。如图 7 所示:3) 设置剥离方式图7到目前为止,所有的设置都已经完成,接下来编译。有兴趣的同学可以观察一下编译的过程,会发现通过设置 prel
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024四川雅安市市属国有企业高级管理人员8人笔试参考题库附带答案详解
- 初中物理人教版(2024)八年级上册(2024)第3节 汽化和液化教案配套
- 发票勾选平台培训
- 2024华电江西发电有限公司所属企业面向系统内外公开招聘4人笔试参考题库附带答案详解
- 2024北京飞机维修工程有限公司市场化人才招聘笔试参考题库附带答案详解
- 人教部编版 (五四制)一年级下册13 荷叶圆圆教案设计
- 冀教版一年级下册五 100以内的加法和减法(一)教案设计
- 人音版八年级上册老鼠娶亲教学设计
- 服装入门培训课件
- 三年级英语上册 Unit 1 School and Numbers Lesson 2 Boy Girl and Teacher教学设计 冀教版(三起)
- 各种注射技术常见并发症的预防及处理
- 工程竣工验收流程汇报
- 首发经济专题讲座课件
- 压力管道设计与审批人员考试题电子版真题1
- 学习方法教育分享模板
- 新能源设备安装承揽合同三篇
- 运动减脂讲义
- 中国绿色资本市场绿皮书(2023-2024)
- 加油站施工施工组织设计方案
- 应急停水停电培训资料
- 传染病防治知识和技能培训计划
评论
0/150
提交评论