关于为什么Windows的.dll不适用于Linux的细节

Specifics on why windows' .dll is not for linux

本文关键字:适用于 Linux 细节 不适用 dll 为什么 Windows      更新时间:2023-10-16

我很好奇能够在linux编译的C 代码中使用Windows中有史以来最原始的dll-library。让我们假设所讨论的库不是Windows Core的可怕专有

…只是一个带有假API的人(这既是标题和实现):

// MathFuncsDll.h
namespace MathFuncs
{
    class MyMathFuncs
    {
    public:
        // Returns a + b
        static __declspec(dllexport) double Add(double a, double b);
        // Returns a - b
        static __declspec(dllexport) double Subtract(double a, double b);
    };
}

// MathFuncsDll.cpp
#include "MathFuncsDll.h"
using namespace std;
namespace MathFuncs
{
    double MyMathFuncs::Add(double a, double b)
    {
        return a + b;
    }
    double MyMathFuncs::Subtract(double a, double b)
    {
        return a - b;
    }
}

这个库将没有其他依赖项,除了< iostream>,它会吗?

linux compiled .cpp将包含以下内容:

// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib
#include <iostream>
#include "MathFuncsDll.h"
using namespace std;
int main()
{
    double a = 7.4;
    int b = 99;
    cout << "a + b = " <<
        MathFuncs::MyMathFuncs::Add(a, b) << endl;
    cout << "a - b = " <<
        MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
    return 0;
}

样品取自Amazing MSDN教程。

因此,为了清楚我的问题:什么停止Linux编译器和链接工具使用依赖依据.dll库MathDuncsDll就像另一个。也许是另一种电话语法?也许整个链接过程是不同的?(我想听听细节,而不仅仅是含糊的"这些操作系统在基本上是不同的"answers"不可能从另一个平台上使用某些东西")这些差异需要多少努力要克服(我认为我们不使用葡萄酒)?

非常感谢您!

这应该回答您的问题:https://stackoverflow.com/a/1908981/856199。

Windows使用Coff格式,Linux使用精灵。这些不兼容。此外,Windows和Linux具有不同的ABI(请参阅http://en.wikipedia.org/wiki/application_binary_interface)。这意味着该代码即使是加载和执行的代码也将导致垃圾,因为与系统的其余部分的通信将被拼命。例如,一个函数期望其数据和代码以不同的顺序存在于不同的地址。尝试执行该代码的结果几乎是随机的。

当然,Linux编译器可以使用Windows ABI并产生COFF文件。实际上,它可以并且可以做到;它称为"交叉编译器"。我正在使用其中之一来构建Windows库和 *.EXE文件下的Linux。但是,由于Coff vs Elf和ABI差异,不可能使用相同的二进制文件作为Linux .so和Windows .dll。

不兼容的应用程序二进制界面是限制使用一个工具链构建的程序以与其他工具链编译的程序不使用二进制级别。

例如,在C 的Windows上,异常传播遵循SET跳跃/跳远模型,而在Linux ITS矮人2中。如果您曾经在Windows上使用mingw作为工具链,则TDM-GCC Mingw发行版允许您允许您使用在两者之间进行选择。

如果您想使用任何跨平台项目,则需要使用您一直在构建其余程序的工具链构建它,否则它们无法同时使用。

链接的答案包含有关此的更多详细信息。

除了其他答案外,Windows和Linux中的链接还有不同的语义,请阅读Levine的链接和加载程序的书。