我有一个问题可能有点傻,因为我很确定我可能已经知道了答案。
假设你有linux下的静态库A和动态共享库B以及你的程序C.假设库A调用库B中的函数,并且程序从库A调用函数。现在假设C中调用的所有函数都不使用B中的函数。
要编译C,仅仅链接A和省略B就可以了,而且你的程序C可以在没有安装库B的系统上运行吗?
答案 0 :(得分:5)
如果你的程序调用A中没有引用B的函数,则在链接或加载时不需要B,假设A中的函数是在单独的编译单元中,这通常是库的情况。 / p>
链接器将从C使用的库中提取函数,因为它们都不会调用B中的函数,所以不需要B.
答案 1 :(得分:4)
神圣的占位符名称超载,蝙蝠侠。让我们首先用libstatic
,libshared
和myapp
替换A,B和C,以使事情更加清晰:
假设您有静态库
libstatic
,和 动态共享对象库libshared
和 你的程序myapp
在linux下。假设 库libstatic
调用函数 库libshared
和您的程序(myapp
)调用 来自库libstatic
的函数。现在假设myapp
在libstatic
中调用的所有功能 不使用libshared
中的函数。编译
myapp
是否足以链接 只需libstatic
并省略libshared
,而且可以 您的程序myapp
可以在系统上运行 没有安装库libshared
?
因此,我理解您的问题的方式有一个库libstatic
,一些函数,其中使用了libshared
。您想知道:如果我不使用依赖libstatic
的{{1}}函数的任何,libshared
将myapp
链接并运行{{1} }}?
答案是肯定的,只要有两件事情是真的:
您在libshared
中进行的调用不直接依赖libstatic
或间接。这意味着如果libshared
调用myapp
中调用libstatic
中调用libstatic
中的函数的另一个函数的函数,那么libshared
现在依赖于{{ 1}}。
您对myapp
的调用不依赖于libshared
中的任何函数,其实现出现在同一个编译单元(目标文件)中并且有一个调用到libstatic
。链接器在目标文件级别从静态库引入代码,而不是在单个函数级别引入。请记住,这种依赖关系也是类似的链接,所以如果你在libstatic
中调用一个函数,libshared
中的其他内容调用foo.o
中的函数,foo.o
中的函数取决于在bar.o
,你敬酒。
将静态库链接到应用程序时,只链接包含所使用符号(直接或间接)的目标文件。因此,如果bar.o
最终需要libshared
的目标文件都不依赖于myapp
,则libstatic
不依赖于libshared