共享库(.so)文件在链接时需要存在(或指定)吗?
我在这里阅读到(共享对象(.so)、静态库(.a)和动态链接库(DLL's)(.so)之间的区别),说.so文件必须在编译时存在,但根据我的经验,这并不是真的?
共享库只是在运行时使用dlopen和dlsym进行链接,因此当应用程序链接时,该库可能不存在于系统中,对吗?
共享库(.so)文件在链接时需要存在(或指定)吗?
我在这里阅读到(共享对象(.so)、静态库(.a)和动态链接库(DLL's)(.so)之间的区别),说.so文件必须在编译时存在,但根据我的经验,这并不是真的?
共享库只是在运行时使用dlopen和dlsym进行链接,因此当应用程序链接时,该库可能不存在于系统中,对吗?
/usr/lib/x86_64-linux-gnu/libQt5Gui.so
和许多其他库)在构建应用程序和运行应用程序时都需要使用。请阅读关于动态链接器ld-linux.so(8)和ELF的内容。
但是你正在询问动态加载(使用dlopen(3)和dlsym(3)...)插件的问题。 然后阅读Levine的链接器和装载程序, 程序库如何操作, C++ dlopen微型操作, 以及Drepper的如何编写共享库
另请参见此答案。
一些库和框架尝试以与操作系统无关的方式抽象化插件的加载。例如,阅读有关Qt插件支持的内容,或者有关POCO共享库(命名不佳,实际上是关于插件的)。
你可以两全其美,一切都能正常工作。
如果在编译时存在库,而不是显式地通过dlopen/LoadLibrary获取库,你可以直接使用所有函数。
dlopen
是相当专业化的用法。 - Matdlopen
的代码片段,但不使用-ldl
链接标志。对于共享库的正常使用,“几乎总是”必需的。 - Mat