共享库(.so)文件是否需要在链接时出现(或指定)?

13

共享库(.so)文件在链接时需要存在(或指定)吗?

我在这里阅读到(共享对象(.so)、静态库(.a)和动态链接库(DLL's)(.so)之间的区别),说.so文件必须在编译时存在,但根据我的经验,这并不是真的?

共享库只是在运行时使用dlopen和dlsym进行链接,因此当应用程序链接时,该库可能不存在于系统中,对吗?


只要在这个网站上搜索带有"undefined reference"的问题,你会发现在某些情况下它是必需的。我认为大多数情况下,手动使用dlopen是相当专业化的用法。 - Mat
1
什么时候是必要的,什么时候不是? - Shuzheng
1
尝试编译调用 dlopen 的代码片段,但不使用 -ldl 链接标志。对于共享库的正常使用,“几乎总是”必需的。 - Mat
编译时:否;链接时:是;运行时:是。在某些平台上(例如AIX),您可以在链接时使用_import-files_而不是共享库。 - Lorinczy Zsigmond
2个回答

7
大多数共享库需要在构建时和运行时都存在。请注意,共享库不是DLL(这是Windows的事情)。
我假设您正在为Linux编写代码。其他操作系统的细节有所不同(并且很重要)。
例如,如果您正在编译Qt应用程序,则需要Qt共享库(例如/usr/lib/x86_64-linux-gnu/libQt5Gui.so和许多其他库)在构建应用程序和运行应用程序时都需要使用。请阅读关于动态链接器ld-linux.so(8)ELF的内容。

但是你正在询问动态加载(使用dlopen(3)dlsym(3)...)插件的问题。 然后阅读Levine的链接器和装载程序, 程序库如何操作, C++ dlopen微型操作, 以及Drepper的如何编写共享库

另请参见此答案

一些库和框架尝试以与操作系统无关的方式抽象化插件的加载。例如,阅读有关Qt插件支持的内容,或者有关POCO共享库(命名不佳,实际上是关于插件的)。


因此,共享库是否总是可以用于动态加载?指定.so文件必须在链接时的原因是程序明确地引用调用中的函数,而不是间接使用dlopen()吗? - Shuzheng
1
你需要阅读我给你的所有参考资料(而且你需要超过一周的时间来阅读所有内容)。详细信息是针对操作系统特定的。 - Basile Starynkevitch
谢谢,我会的! - Shuzheng

-1

你可以两全其美,一切都能正常工作。

如果在编译时存在库,而不是显式地通过dlopen/LoadLibrary获取库,你可以直接使用所有函数。


如果在编译时指定,共享库会像静态库一样运行,还是在运行时仍然动态链接? - Shuzheng
后者:在运行时动态执行。 - Lorinczy Zsigmond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接