链接二进制库或共享库时,为什么必须传入我依赖的共享库?

When linking a binary or shared library, why do I have to pass in shared libraries I depend on?

本文关键字:共享 依赖 为什么 二进制 链接      更新时间:2023-10-16

假设我正在尝试创建一个二进制myprogrammyprogram包括一个文件foo.h,其中声明了一些函数;这些函数在libfoo.so中定义。因此,在构建myprogram时,我将libfoo.so传递给链接器...不,不是名称"libfoo.so",而是实际的共享库文件。

我的问题是,为什么有必要这样做?我的理解是,只有在运行时才需要共享库,当动态链接器将其加载到内存中并在myprogram中修复对它的所有引用时。静态链接器除了将其名称放入共享库列表中之外,还对libfoo.so执行什么操作?

静态链接器除了将其名称放入共享库列表中之外,还对libfoo.so做了什么?

对于生成动态链接的可执行文件,基本上就是这样!它还确认,在链接时可用的共享库版本,所有未定义的符号引用都由其中一个共享库定义。此属性允许您进行有意义的构建时(autoconf 样式)测试,例如,确保libfoo.so是一个足够新的版本,可以在其中包含bar函数。

您混淆了静态和动态链接库。动态库依赖于加载到内存中的运行时模块,并通过导出的方法访问它所需的内容。静态库实际上直接嵌入到您自己的二进制文件中,而不是单独加载。