为什么我们需要单独的库来进行静态和动态链接?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我们需要单独的库来进行静态和动态链接?相关的知识,希望对你有一定的参考价值。

有相关的帖子herehere

根据我的理解,静态链接直接将代码(什么代码?机器代码?)从库插入可执行文件。但是,动态链接只插入引用(指针?)指向库中的某个位置。

然后我想知道为什么我们需要两个相同功能的独立版本的库?例如,对于intel MKL,我们有libmkl_sequential.a和libmkl_sequential.so。而静态链接必须链接静态库,动态链接必须链接动态库。为什么动态链接不能简单地指向静态库?

.so和.a相同功能的内容之间的真正区别是什么?

答案

您要执行的代码需要加载到内存中。静态链接的函数成为程序的一部分,因此在程序启动时它们都被加载在一起。

为什么动态链接不能简单地指向静态库?静态库是一个磁盘文件,你想怎么指向这个?必须有一个机制(加载器和绑定器)调查启动的可执行程序,询问它想要使用哪些函数,并将相应的库加载到内存中。是的,两个版本“libmkl_sequential.a”和“libmkl_sequential.so”中的netto代码(指令)可能相同,但静态和动态类型的库需要由库格式创建者指定的不同辅助元信息。

以上是关于为什么我们需要单独的库来进行静态和动态链接?的主要内容,如果未能解决你的问题,请参考以下文章

linux下的动态链接库和静态链接库到底是个什么鬼?动态链接库的编译与使用

程序员自我修养阅读笔记——动态链接

程序员自我修养阅读笔记——动态链接

动态库和静态库

C语言里面的动态库和静态库

什么叫静态库和动态库