【问题标题】:Using both .so and .dll on Windows在 Windows 上同时使用 .so 和 .dll
【发布时间】:2011-03-15 02:36:54
【问题描述】:

我正在用 C++ 在 windows 中编写一个程序,用户可以在其中编译动态链接库 (windows) 或共享对象文件 (linux) 形式的扩展。

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

【问题讨论】:

    标签: c++ dll object shared


    【解决方案1】:

    简短的回答是“不”

    这不是关于加载,而是关于动态库的内部格式,如预期的入口点。每个操作系统都支持它自己的格式。因此它不会起作用。

    • DLL 是 PE 可执行文件(Windows 上的 exe 也是如此)
    • .so 通常是 ELF 格式(就像 Linux/Unix 上的大多数现代可执行文件一样)。

    但是在 Linux 上通过 Wine 支持 PE 可执行文件,并且 Wine 程序可以使用 DLL。但这可能不是您想要的。

    在Windows上也有一些通过cygwin对ELF格式的支持,也有一些编译器可以加载coff格式(ELF之前在Unix上使用的那种)。我很久以前就用过 DJGPP。

    【讨论】:

    • 编程语言Ruby可以从windows上的.so文件加载扩展,它是怎么做到的?
    • 我会检查,但这可能只是扩展名的更改,内部格式为 PE DLL。
    • 有些windows编译器支持elf格式,看我的回答。我必须检查一下,因为我至少有 10 年没有在 Windows 上这样做了……
    • @Langley:我检查了 Ruby 中的 DL 库确实在 Windows 上使用 PE 格式的 DLL 而不是 ELF .so。它可能更改了扩展名,因为 DL.dlopen() 函数需要文件路径并且 .so 包含在其中。将 .dll 重命名为 .so 避免拥有两组相同的 ruby​​ 文件。
    • Apache HTTPD 对其扩展库做同样的事情 -- 带有 .so 扩展名的 PE DLL。
    【解决方案2】:

    DLL 和 SO 是根本不同的格式,所以简而言之,不,您不能在 Linux 上加载 DLL 或在 Windows 上加载 SO。

    【讨论】:

    • Ruby 之类的程序如何从 .so 文件加载扩展名,即使在 Windows 上也是如此?
    • @Langley:我不了解 Ruby,但 .dll 扩展名在 Windows 上并不重要(也就是说,您可以在任何文件上调用 LoadLibrary(),即使它没有命名为 *.dll )。 Ruby 发行版可能刚刚将其 DLL 命名为 .so 以使其构建系统运行良好,即使它们实际上是 Windows DLL 格式。
    【解决方案3】:

    AFAIK,Windows 和 Linux 处理共享函数调用的方式非常不同(例如,变量如何存储在堆栈中),因此 .so 文件在 Win32 平台上不起作用,而 .dlls 在Linux。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 2011-02-09
      相关资源
      最近更新 更多