




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
技巧:Linux 动态库与静态库制作及使用详解标准库的三种连接方式及静态库制作与使用方法陈 鲁, 软件工程师, IBM陈鲁,2010 年 4 月加入 IBM CSTL。他熟悉 C/C+、bat/sh、XML、Windows/Linux makefile、CIM。简介:Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题; 2)在 Linux 静态库的制作过程中发现有别于 Windows 下静态库的制作方法;3)在 Linux 应用程序链接第三方库或者其他静态库的时候发现链接顺序的烦人问题。本文就这三个问题针对 Linux 下标准库链接和如何巧妙构建 achrive(*.a) 展开相关介绍。本文的标签: 应用开发标记本文!发布日期:2011 年 11 月 02 日 级别:中级 访问情况 :5826 次浏览 评论:2(查看|添加评论 - 登录) 平均分 (15个评分)为本文评分两个要知道的基本知识Linux 应用程序因为 Linux 版本的众多与各自独立性,在工程制作与使用中必须熟练掌握如下两点才能有效地工作和理想地运行。 1. Linux 下标准库链接的三种方式(全静态 , 半静态 (libgcc,libstdc+), 全动态)及其各自利弊。2. Linux 下如何巧妙构建 achrive(*.a),并且如何设置链接选项来解决 gcc 比较特别的链接库的顺序问题。三种标准库链接方式选项及对比为了演示三种不同的标准库链接方式对最终应用程序产生的区别,这里用了一个经典的示例应用程序 HelloWorld 做演示,见 清单 1 HelloWorld。整个工程可以在文章末尾下载。 清单 1. HelloWorld #include #include using std:cout; using std:endl; int main(int argc, char* argv) printf(HelloWorld!(Printed by printf)n); coutHelloWorld!(Printed by cout)endl; return 0; 三种标准库链接方式的选项及区别见 表 1表 1. 三种标准库链接方式的选项及区别标准库连接方式示例连接选项优点缺点全静态-static -pthread -lrt -ldl不会发生应用程序在 不同 Linux 版本下的标准库不兼容问题。生成的文件比较大,应用程序功能受限(不能调用动态库等)全动态-pthread -lrt -ldl生成文件是三者中最小的比较容易发生应用程序在 不同 Linux 版本下标准库依赖不兼容问题。半静态 (libgcc,libstdc+)-static-libgcc -L. -pthread -lrt -ldl灵活度大,能够针对不同的标准库采取不同的链接策略,从而避免不兼容问题发生。结合了全静态与全动态两种链接方式的优点。比较难识别哪些库容易发生不兼容问题,目前只有依靠经验积累。某些功能会因选择的标准库版本而丧失。上述三种标准库链接方式中,比较特殊的是 半静态链接方式,主要在于其还需要在链接前增加额外的一个步骤:ln -s g+ -print-file-name=libstdc+.a,作用是将 libstdc+.a(libstdc+ 的静态库)符号链接到本地工程链接目录。-print-file-name 在 gcc 中的解释如下:-print-file-name= Display the full path to library 为了区分三种不同的标准库链接方式对最终生成的可执行文件的影响,本文从两个不同的维度进行分析比较: 维度一:最终生成的可执行文件对标准库的依赖方式(使用 ldd 命令进行分析)ldd 简介:该命令用于打印出某个应用程序或者动态库所依赖的动态库 涉及语法:ldd OPTION. FILE.其他详细说明请参阅 man 说明。 三种标准库链接方式最终产生的应用程序的可执行文件对于标准库的依赖方式具体差异见 图 1、图 2、图 3所示: 图 1. 全静态标准库链接方式图 2. 全动态标准库链接方式图 3. 半静态(libgcc,libstdc+) 标准库链接方式通过上述三图,可以清楚的看到,当用 全静态标准库的链接方式时,所生成的可执行文件最终不依赖任何的动态标准库,而 全动态标准库的链接方式会导致最终应用程序可执行文件依赖于所有用到的标准动态库。区别于上述两种方式的 半静态链接方式则有针对性的将 libgcc 和 libstdc+ 两个标准库非动态链接。(对比 图 2与 图 3,可见在 图 3中这两个标准库的动态依赖不见了) 从实际应用当中发现,最理想的标准库链接方式就是半静态链接,通常会选择将 libgcc 与 libstdc+ 这两个标准库静态链接,从而避免应用程序在不同 Linux 版本间标准库依赖不兼容的问题发生。 维度二 : 最终生成的可执行文件大小(使用 size 命令进行分析)size 简介:该命令用于显示出可执行文件的大小 涉及语法:size objfile.其他详细说明请参阅 man 说明。 三种标准库链接方式最终产生的应用程序的可执行文件的大小具体差异见 图 4、图 5、图 6所示: 图 4. 全静态标准库链接方式图 5. 全动态标准库链接方式图 6. 半静态(libgcc,libstdc+) 标准库链接方式通过上述三图可以看出,最终可执行文件的大小随最终所依赖的标准动态库的数量增加而减小。从实际应用当中发现,最理想的是 半静态链接方式,因为该方式能够在避免应用程序于 不同 Linux 版本间标准库依赖不兼容的问题发生的同时,使最终生成的可执行文件大小最小化。 示例链接选项中所涉及命令(引用 GCC 原文):-llibrary-l library:指定所需要的额外库 -Ldir:指定库搜索路径 -static:静态链接所有库 -static-libgcc:静态链接 gcc 库 -static-libstdc+:静态链接 c+ 库 关于上述命令的详细说明,请参阅 GCC 技术手册 回页首Linux 下静态库(archive)的制作方式:涉及命令:arar 简介:处理创建、修改、提取静态库的操作 涉及选项:t - 显示静态库的内容 rabfu - 更新或增加新文件到静态库中 s - 创建文档索引 ar -M ar.mac echo SAVE ar.mac echo END ar.mac ar -M ar.mac echo ADDLIB xml.a ar.mac echo SAVE ar.mac echo END ar.mac ar -M ar.mac echo SAVE ar.mac echo END ar.mac $(AR) -M ar.mac $(foreach LIB, $(filter %.a, $), echo ADDLIB $(LIB) ar.mac ) echo SAVE ar.mac echo END ar.mac $(AR) -M ar.mac $(RM) ar.mac ) endef $(TargetDir)/$(TargetFileName):$(OBJS) $(BUILD_LIBRARY) 通过 图 9,我们可以看到,用这种方式产生的 demo.a 才是我们想要的结果。 图 9. 巧妙创建的静态库文件结果回页首Linux 静态库链接顺序问题及解决方法:正如 GCC 手册中提到的那样:It makes a difference where in the command you write this option; the linkersearches and processes libraries and object files in the order they are specified.Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o . If bar.o refers to functions in z , those functions may not be loaded. 为了解决这种库链接顺序问题,我们需要增加一些链接选项 :$(CXX) $(LINKFLAGS) $(OBJS) -Xlinker -( $(LIBS) -Xlinker -) -o $通过将所有需要被链接的静态库放入 -Xlinker -( 与 -Xlinker -) 之间,可以是 g+ 链接过程中,自动循环链接所有静态库,从而解决了原本的链接顺序问题。 涉及链接选项:-Xlinker-Xlinker optionPass option as an option to the linker. You can use this to supply system-specificlinker options which GCC does not know how to recognize. 回页首小结本文介绍了 Linux 下三种标准库链接的方式及各自利弊,同时还介绍了 Linux 下静态库的制作及使用方法,相信能够给 大多数需要部署 Linux 应用程序和编写 Linux Makefile 的工程师提供有用的帮助。 回页首下载描述名字大小下载方法本文用到的 HelloWorld 代码示例HelloWorld.zip2.49KBHTTP参考的 GCC PDF 文档gcc.pdf2.88MBHTTP关于下载方法的信息 Get Adobe Reader参考资料 学习 有关 ar, 请参考: linux ar 打
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新型地暖系统设计与智能化家居集成服务合同
- 2025年智能教育解决方案教师技能提升培训协议
- 2025年度特色西餐厅高级管理职位聘任协议书样本
- 2025年度高端别墅群消防设施建设与专业保养服务合同
- 2025年新型环保装配式商业综合体建设施工合同样本
- 2025年生态堡坎工程设计与施工一体化项目合作协议
- 振兴区应急预案编制说明(3篇)
- 2025年度夫妻共同债务清理与财产分配协议
- 2025年新能源汽车售后服务合作合同汇编
- 2025年度绿色食品冷链配送及城乡配送体系建设合作协议
- 《工艺管理与改善》课件
- 《交通事故车辆及财物损失价格鉴证评估技术规范》
- 《广东省花生全程机械化栽培技术规程》
- 品管圈PDCA改善案例-降低住院患者跌倒发生率
- 外科微创手术管理制度
- 心理危机干预的伦理问题探讨-洞察分析
- 智慧校园医疗系列
- 《中小学校园食品安全和膳食经费管理工作指引》专题讲座
- 梨专题知识讲座
- GB/T 44601-2024信息技术服务服务生存周期过程
- 天津市红桥区2024-2025学年七年级上学期10月期中考试语文试题
评论
0/150
提交评论