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

Gcc 如果应用程序链接到共享库,为什么在编译时需要该库?,gcc,dynamic,linker,Gcc,Dynamic,Linker,如果我的术语不正确,我会提前道歉 假设我有一个名为libVectorMath.so的共享库。其中有两个有趣的函数,addVector()和subtractVector()。这两个函数是在vectorMath.h中原型化的。我还有一个名为testVectorMath的可执行文件,它使用这两个函数,并动态链接到libVectorMath.so 一般来说,要构建testVectorMath,我还需要构建libVectorMath.so。为什么会这样?头文件vectorMath.h是否不足以告诉test

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

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

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

换句话说,
testVectorMath
中不能有一些说明来说明“查找名为
libVectorMath.so
的库,然后在其中查找名为
addVector()
subtractVector()
的符号”

阅读此文。它以一种非常好的方式讲述了这一点

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

请看下面的主要答案,如何告诉可执行文件在何处找到vectorMath.h中声明的函数?