linux动态库和静态库依赖问题

linux下动态库.so文件和.a文件是否是独立可用的? 比如我有个dynamic.so和static.o文件,这两个文件是否可能依赖于别的so和a文件,甚至有没有可能依赖于.cpp/.c文件,或者只可能依赖其中的一种?即so和a文件是否一定是独立可用不依赖于任何别的东西

linux下动态库.so文件和.a文件是独立可用的,.so和.a文件是独立可用不依赖于任何别的东西

linux下动态库.so文件和.a文件是独立可用的不依赖于任何别的东西

Linux静态库(含依赖库)实战与简析

想一想 stdio 这个标准库,应该明白什么是**库**。

Linux静态库(含依赖库)实战与简析

linux 下动态库文件 不是独立可用的, 需要解析依赖关系才能实现功能调用; linux下静态库是独立可用, 不用解析依赖可直接调用其中功能函数.

linux下的静态库依赖

背景

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

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

方案

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

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

打包

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

CREATE libstatic.a
SAVE
END
1
2
3
4
5
这个脚本的作用是创建一个空的名为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
1
2
3
4
5
然后在shell中执行上面的命令,将静态库自己的.o文件添加到库中。

OPEN libstatic.a
ADDLIB libstatic123.a
SAVE
END
1
2
3
4
5
6
这个脚本的作用是打开库文件然后添加另一个依赖库文件。
将脚本保存后同样使用ar -M执行。

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

linux下动态库.so文件和.a文件是独立可用的 然后.so和.a文件是独立可用不依赖于任何别的东西

很不幸,以上回答全是错的,经过我自己动手实验发现,不管是动态库还是静态库都有可能不是独立可用的,都有可能依赖于别的库。

linux下动态库.so文件和.a文件是否是独立可用的?
==》.so 类似于 可执行程序的存在,只是必须依附于可执行程序才能执行,因为自身没有程序入口
==》.a 其实是打包的.o, 你就当它是编译生成的.o的集合就行了
==》背景阐述玩了,看下面的问题

比如我有个dynamic.so和static.o文件,这两个文件是否可能依赖于别的so和a文件,
==》当然可以,举个简单例子,我们自己编译出来的程序,尤其是windows的程序,为什么拷到别的没有装开发环境的机器就运行不了,
==》那就是因为缺少.dll(类似于.so), 而这些链接库显然是动态链接库所依赖的
==》再举一个例子,类似上个,微软开发环境有个叫Depends的,就是查看程序依赖的dll,你就发现好多你没见过的.dll被依赖,都是开发包内的

==》与此类似,linux中 ldd, readelf 都可以查看依赖链接库

==》至于.o 也是可以依赖的,你就当它是一个.cpp,编译时不还可以再链接其他的.so或者.a么,那就是依赖

甚至有没有可能依赖于.cpp/.c文件,或者只可能依赖其中的一种?即so和a文件是否一定是独立可用不依赖于任何别的东西

==》依赖源文件,这种说法很混乱,不存在的,你让程序去依赖代码,这不大可能

==》独立可用是可以的,但这只是相对的,举个例子,你写的程序,在不经过打安装包工具打包,依然有可能在其他没开发环境的系统的运行,那就算是不依赖了吧,实际上说法是片面的,因为,操作系统本身就有一些自带的库,这程序还是依赖的,不然,什么产生中断进行输出,弹出程序窗口,这些都是要操作系统来完成的