【发布时间】:2011-03-15 02:36:54
【问题描述】:
我正在用 C++ 在 windows 中编写一个程序,用户可以在其中编译动态链接库 (windows) 或共享对象文件 (linux) 形式的扩展。
在 Windows 上,您使用 LoadLibrary 函数来加载 dll。是否可以对 Windows 上的 .so 文件执行相同的操作,反之亦然,在 linux 上加载 .dlls?
【问题讨论】:
我正在用 C++ 在 windows 中编写一个程序,用户可以在其中编译动态链接库 (windows) 或共享对象文件 (linux) 形式的扩展。
在 Windows 上,您使用 LoadLibrary 函数来加载 dll。是否可以对 Windows 上的 .so 文件执行相同的操作,反之亦然,在 linux 上加载 .dlls?
【问题讨论】:
简短的回答是“不”
这不是关于加载,而是关于动态库的内部格式,如预期的入口点。每个操作系统都支持它自己的格式。因此它不会起作用。
但是在 Linux 上通过 Wine 支持 PE 可执行文件,并且 Wine 程序可以使用 DLL。但这可能不是您想要的。
在Windows上也有一些通过cygwin对ELF格式的支持,也有一些编译器可以加载coff格式(ELF之前在Unix上使用的那种)。我很久以前就用过 DJGPP。
【讨论】:
.so。它可能更改了扩展名,因为 DL.dlopen() 函数需要文件路径并且 .so 包含在其中。将 .dll 重命名为 .so 避免拥有两组相同的 ruby 文件。
DLL 和 SO 是根本不同的格式,所以简而言之,不,您不能在 Linux 上加载 DLL 或在 Windows 上加载 SO。
【讨论】:
AFAIK,Windows 和 Linux 处理共享函数调用的方式非常不同(例如,变量如何存储在堆栈中),因此 .so 文件在 Win32 平台上不起作用,而 .dlls 在Linux。
【讨论】: