【问题标题】:Do shared libraries (.so) files need to present (or specified) at link time?共享库 (.so) 文件是否需要在链接时呈现(或指定)?
【发布时间】:2017-06-20 10:29:41
【问题描述】:

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

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

共享库不只是在运行时使用dlopendlsym 进行链接,因此当应用程序链接时,该库可能不存在于系统上?

【问题讨论】:

  • 只要在这个网站上搜索“未定义参考”的问题,你就会发现有些情况是必要的。我认为大多数情况下,手动 dlopen 是相当专业的用途。
  • 什么时候需要什么时候不需要?
  • 尝试编译一段不带-ldl链接标志的调用dlopen的代码。共享库的正常使用“几乎总是”是必要的。
  • 编译时间:否;链接时间:是的;运行时:是的。在某些平台(例如 AIX)上,您可以在链接时使用 import-files 而不是共享库。

标签: c++ dll shared-libraries


【解决方案1】:

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

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

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

但是您询问的是pluginsdynamic loading(使用dlopen(3)dlsym(3) ...)。 然后阅读 Levine 的 Linkers & LoadersProgram Library HowToC++ dlopen mini HowTo 和 Drepper 的 How To Write Shared Libraries

另见this answer

一些库和框架试图以与操作系统无关的方式抽象插件的加载。阅读例如关于Qt plugins 的支持,或者关于POCO shared libraries(名字不好,是关于插件的)。

【讨论】:

  • 那么,共享库可以一直用于动态加载吗? .so 文件必须在链接时指定的原因是程序在调用中显式引用函数,而不是间接使用 dlopen()?
  • 你需要阅读我给你的所有参考资料(你需要一个多星期的时间来阅读所有这些内容)。详细信息因操作系统而异。
  • 谢谢你,我会的!
【解决方案2】:

你可以同时拥有它,一切都有效。

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

【讨论】:

  • 如果在编译时指定,共享库是作为静态库,还是在运行时仍然是动态链接的?
  • 后者:在运行时动态。
猜你喜欢
  • 2015-03-30
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多