c++ - 创建(和链接)库时的符号解析

标签 c++ linker operating-system shared-libraries

假设 a.cc 定义了一个函数 f_a(),它使用 b.cc< 中定义的函数 f_b()/。从 a.ccb.cc 我创建了一个动态库 libdynamic.so

假设文件main.cc使用f_a,我将编译如下:

g++ -o main main.cc -ldynamic

动态链接器如何将 f_a(以及随后的 f_b)的定义引入可执行文件? libdynamic.sof_a 的定义是否已经被f_b 解析?或者动态链接器也会在运行时解决这个(内部)依赖?

最佳答案

由于您使用的是共享库 (*.so),因此将定义引入可执行文件。它保留在库本身中,并在运行时解析,这就是为什么如果删除共享库,程序将无法正常运行。

另一方面,库中的所有内部符号(在您的示例中为 f_af_b)必须在构建库时解析。从编译过程中可以看出这一点:

g++ -fPIC -c a.cc
g++ -fPIC -c b.cc
g++ -shared -Wl,-soname,libdynamic.so -o libdynamic.so a.o b.o

在最后阶段,g++调用链接器(ld)链接f_a.of_b.o。事实上,您可以(可能)直接调用链接器:

ld -shared -soname=libdynamic.so -o libdynamic.so a.o b.o

如果您仍然对整个过程及其所有细节感到好奇,这里有一篇有用的引用文章:Linkers and Loaders, by Sandeep Grover .

关于c++ - 创建(和链接)库时的符号解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24991828/

相关文章:

c++ - 剥离项目的最佳 C++ 容器?

ios - 尝试使用ASIHTTP时出现mach-o链接器错误

c++ - 未定义对函数 CMake 的引用

c - 使用 -std=c99 编译时,be64toh 未链接或声明

cocoa - 简单的 cocoa 计算器

c# - 如何从Windows系统中彻底删除文件

linux - 回溯时我们如何确定有多少参数?

c++ - 从 main 返回零中断了我的程序

c++ - 为什么 C++ 标准文件流不更紧密地遵循 RAII 约定?

c++ - mac语音合成管理器,创建语音 channel 时,返回参数错误