共享库(.so)文件是否需要在链接时显示(或指定)?
我在这里读到(Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?).so文件必须在编译时出现,但根据我的经验,这不是真的吗?
共享库是否仅在运行时使用 dlopen
和 dlsym
进行链接,以便在链接应用程序时,库可能不存在于系统中?
共享库(.so)文件是否需要在链接时显示(或指定)?
我在这里读到(Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?).so文件必须在编译时出现,但根据我的经验,这不是真的吗?
共享库是否仅在运行时使用 dlopen
和 dlsym
进行链接,以便在链接应用程序时,库可能不存在于系统中?
3 回答
大多数shared libraries都需要在构建时和运行时都存在 . 请注意,共享库不是DLL(这是Windows的事情) .
我假设您为Linux编写代码 . 其他操作系统的细节不同(并且它们很重要) .
例如,如果您正在编译Qt应用程序,则在构建应用程序和运行应用程序时都需要Qt共享库(例如
/usr/lib/x86_64-linux-gnu/libQt5Gui.so
和许多其他库) . 阅读有关动态链接器ld-linux.so(8)&about ELF的信息 .但是你要问dynamic loading(使用dlopen(3)和dlsym(3) ...)的plugins . 然后阅读Levine的Linkers & Loaders,Program Library HowTo,C++ dlopen mini HowTo和Drepper的How To Write Shared Libraries
另见this answer .
一些库和框架尝试以OS中立的方式抽象插件的加载 . 阅读例如关于Qt plugins支持,或关于POCO shared libraries(名字不好,它是关于插件) .
You can have it both way, it all works.
虽然库在编译时出现,而不是通过dlopen / LoadLibrary明确获取库,但您可以直接使用所有函数
这是一个避免在编译时为程序提供
.so
文件的技巧:您始终可以创建模拟C / C接口,并将实现中的方法保持为空,然后在使用该程序时将其链接起来 . 但是,在这种情况下,您必须明确编译代码以创建空函数的共享库,然后再创建实现的库 .
例如,在CMake中,您可以使用
ADD_LIBRARY
添加将创建共享库的源 .这将创建一个
.so
文件,并在您将可执行文件与其链接时最终将程序与其链接 . 在运行时,您可以选择所需的任何.so
文件 .-fPIC
是一个用于创建"position indepedent code"的g标志,因此.so
库中的函数名称不会被破坏 .当然,这是您自己的库的选项,但不是您在外部使用的库,如Qt . 除非你想嘲笑Qt库,这不是那么简单 .