在Windows系统上同时使用.so和.dll文件

8

我正在使用C++在Windows上编写一个程序,用户将能够以动态链接库(Windows)或共享对象文件(Linux)的形式编译扩展。

在Windows上,您可以使用LoadLibrary函数加载dll。是否可能在Windows上对.so文件执行相同操作,反之亦然,在Linux上加载.dll文件?

3个回答

9
简短的回答是“不行”。
这不是关于加载,而是关于动态库的内部格式,如预期的入口点。每个操作系统都支持自己的格式。因此它不起作用。
  • DLL是PE可执行文件(与Windows上的exe一样)
  • .so通常是ELF格式(像Linux / Unix上的大多数现代可执行文件一样)。
但是在Linux上,通过Wine对PE可执行文件提供了一些支持,Wine程序可以使用DLL。但那可能不是你要找的。
在Windows上,通过cygwin也支持ELF格式,并且还有一些编译器可以加载coff格式(在ELF之前在Unix上使用的格式)。我很久以前就用过DJGPP。

编程语言Ruby可以在Windows上从.so文件中加载扩展,它是如何实现的? - Langley
2
我会检查一下,但很可能只是将扩展名更改为PE DLL,并保持内部格式不变。 - kriss
有一些支持 ELF 格式的 Windows 编译器,可以查看我的回答。我需要检查,因为我至少有 10 年没有在 Windows 上这样做了... - kriss
@Langley:我已经检查了Ruby中的DL库,确实在Windows上使用PE格式的DLL,而不是ELF.so。这可能是因为DL.dlopen()函数期望文件路径,并且.so已经包含在其中。将.dll重命名为.so可以避免拥有两组完全相同的Ruby文件。 - kriss
Apache HTTPD 对于其扩展库也是这样,使用扩展名为 .so 的 PE DLL。 - Chris Charabaruk

4

DLL和SO是基本不同的格式,因此简而言之,在Linux上无法加载DLL文件,在Windows上也无法加载SO文件。


1
像Ruby这样的程序如何从.so文件中加载扩展,即使在Windows上也可以呢? - Langley
3
@Langley: 我不了解Ruby,但是在Windows上,.dll扩展名并不重要(也就是说,你可以调用LoadLibrary()函数加载任何文件,即使它的扩展名不是*.dll)。可能是Ruby发行版只是将其DLL文件命名为.so以保持其构建系统的兼容性,尽管它们实际上是采用Windows DLL格式。 - Drew Hall

3
据我所知,Windows和Linux处理共享函数调用的方式非常不同(例如,在堆栈上存储变量的方式),因此.so文件不能在Win32平台上运行,.dll文件也不能在Linux上运行。

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