【发布时间】: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