我很好奇能够在 Linux 编译的 C++ 代码中使用在 Windows 中编译的最原始的 DLL 库。让我们假设有问题的库不是来自 Windows 核心的可怕的专有东西;
…只有一个带有假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 编译的 .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;
}
所以,为了明确我的问题:是什么阻止了 linux 编译器和链接工具MathDuncsDll
像另一个 .so 一样使用无依赖的 .dll 库?也许,另一种调用语法?或者整个链接过程可能不同?(我想听听细节,而不仅仅是模糊的“这些操作系统根本不同”和“不可能在另一个平台上使用某些东西”)这些差异需要付出多少努力才能克服(我假设我们'不使用Wine)?
非常感谢您!