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

Shu*_*eng 6 c++ dll shared-libraries

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

我在这里已经读到了(共享对象(.so),静态库(.a)和DLL(.so)之间的区别?),. so文件必须在编译时出现,但是根据我的经验,这不是真的吗?

共享库不是仅在运行时使用dlopen和链接dlsym,以便在链接应用程序时该库可能不存在于系统上吗?

Bas*_*tch 5

大多数共享库需要在构建时和运行时都存在。请注意,共享库不是 DLL(这是 Windows 的东西)。

我假设您为 Linux 编写代码。其他操作系统的细节有所不同(它们很重要)。

例如,如果您正在编译 Qt 应用程序,/usr/lib/x86_64-linux-gnu/libQt5Gui.so 则在构建应用程序和运行应用程序时都需要 Qt 共享库(例如和许多其他库)。阅读关于动态链接器ld-linux.so(8)和关于ELF 的信息

但是您正在询问插件的动态加载(使用dlopen(3)dlsym(3) ...)。然后阅读 Levine 的Linkers & LoadersProgram Library HowToC++ dlopen mini HowTo和 Drepper 的How To Write Shared Libraries

另请参阅此答案

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