共享对象和动态链接库(DLL)的区别。

5
我有一个库,在编译时会生成一个名为libEXAMPLE.so的共享对象(在so.le文件夹中),以及一个名为EXAMPLE.so的动态链接库(在dll文件夹中)。这两个共享对象的大小非常相似,看起来完全是同一件事。搜索互联网发现,程序使用dll进行符号解析的方式与使用共享对象的方式可能存在差异。
你们能帮我理解这个问题吗?

它们真的不同吗?能否指出您的来源?但据我所知,至少在Linux下(而且考虑到您正在谈论.so文件,您是在Linux下,对吧?),在运行时链接的二进制文件使用ld.so处理,并且可以通过API函数(如dlopen)进行操作。我在任何文档中都没有看到共享对象和动态链接库之间的区别。 - Rook
我认为区别仅在于用于加载动态(共享)库的不同格式,而不是导出类或符号在客户端中的使用方式。 - πάντα ῥεῖ
我听说的经验法则是,如果你计划在构建时链接库,则应使用.so变体,否则如果你使用dlopen加载它们,则应使用dll变体。 - Falcata
@Falcata 不,dlopen()只是用于加载共享库的符合POSIX标准的接口。它并不指定底层操作系统使用的格式。 - πάντα ῥεῖ
我得到的答案是,dll库是使用启用了-Bsymbolic编译器选项构建的,而.so共享对象则没有。 - Falcata
重复的问题? https://dev59.com/NWkw5IYBdhLWcg3wutDK - vsekhar
2个回答

7

我在(so文件夹)中得到了一个libLIBRARY-NAME.so和一个LIBRARY-NAME.so(在dll文件夹中)。这两者之间有什么区别? - Falcata
1
@Falcata 你在哪个主机系统上编译?除非你是交叉编译,否则编译器不太可能在Linux/Unix环境中生成.dll文件。也许你在dll文件夹中看到的结果只是库构建系统的缺陷。 - πάντα ῥεῖ
我正在使用QNX来针对多个平台(ARM等)进行开发。 - Falcata

0

我想使用Linux操作系统。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接