无关的图书馆链接

时间:2010-04-13 17:03:03

标签: linux linker shared-libraries static-libraries

我有一个问题可能有点傻,因为我很确定我可能已经知道了答案。

假设你有linux下的静态库A和动态共享库B以及你的程序C.假设库A调用库B中的函数,并且程序从库A调用函数。现在假设C中调用的所有函数都不使用B中的函数。

要编译C,仅仅链接A和省略B就可以了,而且你的程序C可以在没有安装库B的系统上运行吗?

2 个答案:

答案 0 :(得分:5)

如果你的程序调用A中没有引用B的函数,则在链接或加载时不需要B,假设A中的函数是在单独的编译单元中,这通常是库的情况。 / p>

链接器将从C使用的库中提取函数,因为它们都不会调用B中的函数,所以不需要B.

答案 1 :(得分:4)

神圣的占位符名称超载,蝙蝠侠。让我们首先用libstaticlibsharedmyapp替换A,B和C,以使事情更加清晰:

  

假设您有静态库libstatic,和   动态共享对象库libshared和   你的程序myapp在linux下。假设   库libstatic调用函数   库libshared和您的程序(myapp)调用   来自库libstatic的函数。现在假设   myapplibstatic中调用的所有功能   不使用libshared中的函数。

     

编译myapp是否足以链接   只需libstatic并省略libshared,而且可以   您的程序myapp可以在系统上运行   没有安装库libshared

因此,我理解您的问题的方式有一个库libstatic一些函数,其中使用了libshared。您想知道:如果我不使用依赖libstatic的{​​{1}}函数的任何libsharedmyapp链接并运行{{1} }}?

答案是肯定的,只要有两件事情是真的:

  1. 您在libshared中进行的调用不直接依赖libstatic 或间接。这意味着如果libshared调用myapp中调用libstatic中调用libstatic中的函数的另一个函数的函数,那么libshared现在依赖于{{ 1}}。

  2. 您对myapp的调用不依赖于libshared中的任何函数,其实现出现在同一个编译单元(目标文件)中并且有一个调用到libstatic。链接器在目标文件级别从静态库引入代码,而不是在单个函数级别引入。请记住,这种依赖关系也是类似的链接,所以如果你在libstatic中调用一个函数,libshared中的其他内容调用foo.o中的函数,foo.o中的函数取决于在bar.o,你敬酒。

  3. 将静态库链接到应用程序时,只链接包含所使用符号(直接或间接)的目标文件。因此,如果bar.o最终需要libshared的目标文件都不依赖于myapp,则libstatic不依赖于libshared