链接二进制库或共享库时,为什么必须传入我依赖的共享库?
When linking a binary or shared library, why do I have to pass in shared libraries I depend on?
假设我正在尝试创建一个二进制myprogram
。myprogram
包括一个文件foo.h
,其中声明了一些函数;这些函数在libfoo.so
中定义。因此,在构建myprogram
时,我将libfoo.so
传递给链接器...不,不是名称"libfoo.so",而是实际的共享库文件。
我的问题是,为什么有必要这样做?我的理解是,只有在运行时才需要共享库,当动态链接器将其加载到内存中并在myprogram
中修复对它的所有引用时。静态链接器除了将其名称放入共享库列表中之外,还对libfoo.so
执行什么操作?
静态链接器除了将其名称放入共享库列表中之外,还对
libfoo.so
做了什么?
对于生成动态链接的可执行文件,基本上就是这样!它还确认,在链接时可用的共享库版本,所有未定义的符号引用都由其中一个共享库定义。此属性允许您进行有意义的构建时(autoconf 样式)测试,例如,确保libfoo.so
是一个足够新的版本,可以在其中包含bar
函数。
您混淆了静态和动态链接库。动态库依赖于加载到内存中的运行时模块,并通过导出的方法访问它所需的内容。静态库实际上直接嵌入到您自己的二进制文件中,而不是单独加载。
相关文章:
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- 链接二进制库或共享库时,为什么必须传入我依赖的共享库?
- 使用 libpthread 在共享库中未定义的行为,但不将其作为依赖项在 ELF 中
- 项目 A 依赖共享库 B,B 依赖 C,A 不依赖 C。当我使用 B 的 API 时,警告 B 找不到 C
- 链接共享库依赖项未在 ldd 中列出
- 使用 CMake 和 C++ 处理共享库依赖项
- 如何将所有依赖项和共享库编译为一个二进制文件
- Cmake构建一个共享库,其中包含其所有依赖关系
- lua加载我的c++共享库,但不加载它的依赖共享库
- 共享库依赖于具有硬编码路径的其他库
- 将依赖项添加到现有共享对象库
- Cmake不会将共享库的链接依赖关系传播到我的可执行文件
- 在项目之间共享类,同时绕过stdafx.h依赖关系
- 如何自动链接到共享库的依赖项
- 如何在二进制文件中包含共享库依赖项(不使用.deb或.rpm)和/或针对PulseAudio的静态链接
- 混合静态库和共享库时的链接器依赖关系
- ANDROID:如何在创建依赖于静态库的共享库时正确地链接静态库
- 从C++打印共享库依赖项
- 使用NetBeans在Linux上的共享库中隐藏二级依赖关系
- 具有依赖关系的共享库的动态链接