linux下的静态库依赖

原创 2016年08月29日 20:21:33

linux下的静态库依赖

背景

linux的静态库.a和动态库.so的区别很大,静态库基本上只是一系列.o文件的集合加上符号表,没有链接过程,不能依赖链接其他的静态库或者动态库。如果静态库中用到了其他的库,需要这个静态库的使用者在最终的链接阶段清楚所有使用到的库,然后一一链接。

如果静态库依赖的库很多的话,而且依赖的关系很复杂,那么对于最终的使用者来说绝对是一场噩梦。

方案

linux下的静态库其实就是一系列.o文件的集合加上符号表。那么如果把它所依赖的静态库里的.o全部提取出来,然后再一起打包,更新符号表,是不是最终的使用者就可以不用管这些依赖了呢?
答案是的确可以,优点就是使用者不用去关心一堆静态库依赖,缺点是静态库的编写者需要花费更多的精力,并且静态库的体积会增大。

那么静态库依赖的动态库怎么办呢?
没有办法,静态库上没有链接信息,也不可能把动态库包含在里面,所以静态库如果真的依赖其他库,最好都依赖静态库。

打包

那么怎样将一个静态库打包到另一个静态库里呢?
静态库打包工具ar提供了-q选项来追加.o文件,理论上把所有依赖的静态库解开后打包是可行的,但是这样很难使用脚本来自动化打包,接下来我们使用一种很少见的方式来直接将.a添加到另一个.a中。
ar有一个选项-M,可以执行一种ar脚本,这种脚本的资料非常少,在man ar中都没有介绍。我们接下来就使用这种脚本来将一个静态库添加到另一个静态库中。


CREATE libstatic.a
SAVE
END

这个脚本的作用是创建一个空的名为libstatic.a的库,以上脚本保存为ar.mac
执行ar -M < ar.mac,可以看到这里是使用了重定向输入来执行脚本的。


ar -q libstatic.a s1.o
ar -q libstatic.a s2.o
ar -q libstatic.a s3.o

然后在shell中执行上面的命令,将静态库自己的.o文件添加到库中。


OPEN libstatic.a
ADDLIB libstatic123.a
SAVE
END

这个脚本的作用是打开库文件然后添加另一个依赖库文件。
将脚本保存后同样使用ar -M执行。

这样就完成了将一个库添加到另一个库中,此时可以使用ar -t命令查看一下库里面的内容,可以看到依赖库的.o文件都被包含进去了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库

创建静态库: ar -rcs test.a *.o 查看静态库: ar -tv test.a 解压静态库: ar -x test.a   查看程序依赖的动态库: readelf -a ...
  • fly_qj
  • fly_qj
  • 2012-10-11 23:43
  • 3536

Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f

本文是转载,原文是:http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520101023104745738/ 一、基本概念 1....

交叉编译静态库的链接顺序

交叉编译时遇到:undefined reference to `XXX'. 解决办法: 一,用nm看看库里边是不是有对应的符号: nm *.a/*.lib/*.so |grep "XXX" ...
  • rangf
  • rangf
  • 2012-09-20 15:53
  • 3300

linux下静态库的依赖顺序

贴下结论: LD在链接生成目标文件时, 会从左到有扫描输入的依赖库, 但是, 当依赖库之间也有依赖关系时,必须将”依赖别人的库”放在 “被别人依赖的库”的前面. 否则,会链接失败!

Linux 依赖动态库 / 静态库的动态态库 / 静态库

libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而main.exe又调用了libf...

静态库.a的生成,及生成一个依赖另一个库存在的静态库

今天就来说说.a的制作吧,刚开始做ios开发的时候看见大神把核心代码什么的封成.a就觉得这是手绝活,这几天亲手弄了一下,也就那回事吧 - -! 应主管要求做个静态库,不过这个静态库是建立在三方静态库...

静态链接库相互依赖

想同时链接两个自定义的静态链接库,发现无论以什么顺序链接都会有一些函数未定义。网上搜了一番找到解决方案: 假设有liba.a和libb.a两个静态链接库,则添加链接选项时,多链接其中一个库一遍即可解...

#linux 打包 静态库

有几个.a的静态库,想打成一个用 先解包成o文件 ar x libaaa.a ar x libbbb.a ar rcs libccc.a *.o ar 命令 用途 维护链接编辑器...
  • wpc320
  • wpc320
  • 2013-01-22 20:29
  • 3764

Linux环境下静态库的生成和使用 (.a文件)

原文地址:http://blog.csdn.net/haojiahuo50401/article/details/7101617 这一阵子的工作用到了linux,也用到了linux的静态库和动态库。...

linux 静态库嵌套包含多个.a文件的解决方法

使用ar命令创建静态库时,有时候
  • vah101
  • vah101
  • 2014-11-13 17:42
  • 2493
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)