我正在用 C++ 在 windows 中编写一个程序,在该程序中,用户将能够以动态链接库 (windows) 或共享对象文件 (linux) 的形式编译扩展。
在 Windows 上,您使用该LoadLibrary
函数来加载 dll。是否可以对 Windows 上的 .so 文件执行相同的操作,反之亦然,在 linux 上加载 .dlls?
最简洁的答案是不”
这不是关于加载,而是关于动态库的内部格式,如预期的入口点。每个操作系统都支持它自己的格式。因此它不会工作。
但是在 Linux 上,通过 Wine 支持 PE 可执行文件,并且 Wine 程序可以使用 DLL。但这可能不是您想要的。
在 Windows 上也有一些通过 cygwin 对 ELF 格式的支持,也有一些编译器可以加载 coff 格式(ELF 之前在 Unix 上使用的那种)。我很久以前就用过DJGPP。
DLL 和 SO 是根本不同的格式,所以简而言之,不,您不能在 Linux 上加载 DLL 或在 Windows 上加载 SO。
AFAIK,Windows 和 Linux 处理共享函数调用的方式非常不同(例如变量如何存储在堆栈中),因此 .so 文件在 Win32 平台上不起作用,而 .dll 在 Linux 上不起作用。