如果应用程序链接到共享库,为什么在编译时需要该库?

时间:2012-11-02 22:43:19

标签: gcc dynamic linker

如果我的术语不正确,我会提前道歉。

假设我有一个名为libVectorMath.so的共享库。其中有两个有趣的函数addVector()subtractVector()。这两个函数在vectorMath.h中进行了原型化。我还有一个名为testVectorMath的可执行文件,它使用这两个函数,并动态链接到libVectorMath.so

一般来说,要构建testVectorMath,我还需要构建libVectorMath.so。为什么是这样?标题文件vectorMath.h不足以告诉testVectorMath它应该在libVectorMath.so中找到哪些符号吗?

换句话说,testVectorMath无法在其中添加一些说明“查找名为libVectorMath.so的库,然后查找名为addVector()subtractVector()的符号在其中“?

1 个答案:

答案 0 :(得分:0)

阅读此link。它以非常好的方式讲述了同样的事情!

以上摘录如下: 所有共享库方案的工作方式基本相同。在链接时,链接器像往常一样搜索库以查找解析否则未定义的外部符号的模块。但是,链接器不是将模块的内容复制到输出文件中,而是记下模块来自哪个库,并将库列表放在可执行文件中。加载程序时,启动代码会在程序启动之前找到这些库并将它们映射到程序的地址空间,图1.标准操作系统文件映射语义自动共享映射为只读或复制的页面-写。执行映射的启动代码可以在操作系统中,可执行文件,在一个特殊的动态链接器中映射到进程'地址空间,或三者的某种组合。