关于为什么Windows的.dll不适用于Linux的细节
Specifics on why windows' .dll is not for linux
我很好奇能够在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的链接和加载程序的书。
- 适用于 Linux 的 c++ 上的代理脚本
- 适用于win32、linux、mac的POSIX C包装器
- 从uint8_t到NPY_UINT16 PyArray_SimpleNewFromData.适用于Linux,但不适用于
- 如何在 C++ 中创建一个适用于 Windwos 和 Linux 的文件夹(目录)
- "undefined reference"(适用于Linux,但不适用于Windows上的Cygwin)
- 哪个浏览器插件框架适用于Linux中的所有浏览器
- C++适用于Windows,Linux和Mac的简单GUI
- 在C++std::streams中,失败后,如何获得失败原因?必需:线程安全,适用于Windows和Linux(或至少M
- 适用于Linux的免费并行(MPI)调试器
- Windows 上的 Cmake 不添加共享库路径(适用于 linux)
- 正则表达式适用于 Linux,但不适用于 Solaris
- 适用于Linux上Android的Poco C++
- 在 Linux 上使用 GCC 交叉编译适用于 Windows 的 Qt 应用程序
- 如何获取 Linux 中 mmap() 函数的 FileDescriptor 的内存地址,适用于 Video4Linux
- 适用于 Linux 和 Windows 的 C 和 C++
- 适用于 Linux 的内存分析工具
- random_shuffle() 适用于 Windows,但不能在 Linux 上编译
- 如何捆绑适用于 Linux 的应用程序
- C++服务器Linux机器上的分段故障-适用于Mac
- 适用于Linux的PostMessage