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中声明的函数?