首页 文章

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

提问于
浏览
2

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

我在这里读到(Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?).so文件必须在编译时出现,但根据我的经验,这不是真的吗?

共享库是否仅在运行时使用 dlopendlsym 进行链接,以便在链接应用程序时,库可能不存在于系统中?

3 回答

  • 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 & LoadersProgram Library HowToC++ dlopen mini HowTo和Drepper的How To Write Shared Libraries

    另见this answer .

    一些库和框架尝试以OS中立的方式抽象插件的加载 . 阅读例如关于Qt plugins支持,或关于POCO shared libraries(名字不好,它是关于插件) .

  • 0

    You can have it both way, it all works.

    虽然库在编译时出现,而不是通过dlopen / LoadLibrary明确获取库,但您可以直接使用所有函数

  • 0

    这是一个避免在编译时为程序提供 .so 文件的技巧:

    您始终可以创建模拟C / C接口,并将实现中的方法保持为空,然后在使用该程序时将其链接起来 . 但是,在这种情况下,您必须明确编译代码以创建空函数的共享库,然后再创建实现的库 .

    例如,在CMake中,您可以使用 ADD_LIBRARY 添加将创建共享库的源 .

    ADD_LIBRARY(MyLibName SHARED empty1.cpp empty2.cpp -fPIC)
    

    这将创建一个 .so 文件,并在您将可执行文件与其链接时最终将程序与其链接 . 在运行时,您可以选择所需的任何 .so 文件 .

    -fPIC 是一个用于创建"position indepedent code"的g标志,因此 .so 库中的函数名称不会被破坏 .

    当然,这是您自己的库的选项,但不是您在外部使用的库,如Qt . 除非你想嘲笑Qt库,这不是那么简单 .

相关问题