参考this answer:
有两种Linux C / C ++库类型。
静态库(
*.a
)是目标代码的归档,它们与应用程序链接并成为其中的一部分。他们被创造了 使用ar(1)
命令可以操作,并且ar -t libfoo.a
将列出库/存档中的文件。动态链接的共享对象库(
*.so
)可以通过两种方式使用。
- 共享对象库可以在运行时动态链接,但可以静态识别。这些库必须在期间可用 编译/链接阶段。共享对象不包含在 二进制可执行文件但与执行有关。
- 可以使用动态链接加载器系统在执行期间动态加载/卸载和链接共享对象库 功能。
制作动态 lib tied to the execution是什么意思?
是否像Windows manifest files那样允许应用加载特定的 dll ?
控制 .so 加载的机制是什么?
必须有这样一种机制,否则"编译" .so 是唯一一个允许加载的内容,这使得动态的目的失败了?
答案 0 :(得分:0)
这意味着该库在链接时可用,因此链接器可以验证您.so
中引用的函数是否存在于.so
中。优点是对这些函数的调用是透明的。换句话说,如果您使用
.so
int foo(double bar);
你这样称呼它
int res = foo(4.2);
链接器确保foo
存在,并且它需要一个double
类型的参数。在那之后它"链接"调用网站int res = ...
到该函数。
在执行期间动态加载/卸载使您可以在构建系统上没有.so
的情况下进行链接(因此,没有"静态感知")。为了增加灵活性,您可以打开系统,直到找不到目标.so
中所需的功能。您的通话顺序看起来也比foo(4.2)
要复杂得多,因为您需要完成dlopen
准备步骤。有关.so
中呼叫功能的更多信息位于this Q&A。