假设 a.cc
定义了一个函数 f_a()
,它使用 b.cc< 中定义的函数
。从 f_b()
/a.cc
和 b.cc
我创建了一个动态库 libdynamic.so
。
假设文件main.cc
使用f_a
,我将编译如下:
g++ -o main main.cc -ldynamic
动态链接器如何将 f_a
(以及随后的 f_b
)的定义引入可执行文件? libdynamic.so
中f_a
的定义是否已经被f_b
解析?或者动态链接器也会在运行时解决这个(内部)依赖?
最佳答案
由于您使用的是共享库 (*.so
),因此未将定义引入可执行文件。它保留在库本身中,并在运行时解析,这就是为什么如果删除共享库,程序将无法正常运行。
另一方面,库中的所有内部符号(在您的示例中为 f_a
和 f_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.o
和f_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/