【问题标题】:Difference between a shared object and a dll共享对象和dll之间的区别
【发布时间】:2012-10-29 00:55:11
【问题描述】:

我有一个库,它在编译时正在构建一个名为 libEXAMPLE.so(在 so.le 文件夹中)的共享对象,以及一个名为EXAMPLE.so 的dll(在dll 文件夹中)。这两个共享对象的大小非常相似,看起来完全一样。上网搜索发现,程序使用 dll 进行符号解析的方式与使用共享对象的方式可能有所不同。

你们能帮我理解一下吗?

【问题讨论】:

  • 它们真的不同吗?向我们指出您的消息来源可能会很好!但据我所知,至少在 linux 下(鉴于您正在谈论 .so 文件,您在 linux 下,对吗?),在运行时链接的二进制文件使用ld.so 处理,并且可以通过 API 函数操作如dlopen。我在文档中看不到共享对象和动态链接库之间的任何区别。
  • 我认为区别仅在于用于加载动态(共享)库的不同格式,而不在于客户端如何使用导出的类或符号。
  • 我听说一般的经验法则是,如果您打算在构建时链接库,那么应该使用 .so 变体,否则如果您使用 dlopen 然后 dll 加载它们应该使用变体。
  • @Falcata 不,dlopen() 只是用于加载共享库的 POSIX 兼容接口。它没有指定用于底层操作系统的格式。
  • 所以我得到的答案是 dll 库是在启用 -Bsymbolic 编译器选项的情况下构建的,而 .so 共享对象则没有。

标签: c++ c dll shared-libraries


【解决方案1】:

“DLL”是windows喜欢给他们的动态库命名的方式

“SO”是linux喜欢给他们的动态库命名的方式

两者的目的相同:动态加载。

Windows 使用 PE 二进制格式,Linux 使用 ELF。

体育: http://en.wikipedia.org/wiki/Portable_Executable

精灵: http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

【讨论】:

  • 我在(so 文件夹)和一个 LIBRARY-NAME.so(在 dll 文件夹)中得到了一个 libLIBRARY-NAME.so。两者有什么区别?
  • @Falcata 你在哪个主机系统上编译?除非您进行交叉编译,否则编译器不太可能在 linux/unix 环境中生成 .dll 文件。也许这只是库构建系统的一个缺陷,您在 dll 文件夹中看到结果。
  • 我正在使用 QNX 来针对多个平台(ARM 等)。
【解决方案2】:

我想是 Linux 操作系统。

在 Linux 中,静态库(.a,也称为档案)用于在编译时进行链接,而共享对象 (.so) 用于在加载时和运行时进行链接。

在您的情况下,库似乎出于某种原因区分了加载时链接的文件 (libEXAMPLE.so) 和运行时链接 (EXAMPLE.so),即使这两个文件完全相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2011-10-01
    • 2012-01-12
    • 1970-01-01
    • 2011-11-12
    • 2023-04-07
    相关资源
    最近更新 更多