1

我一直在通过MSDN上的 dll 演练,它工作正常。然后我删除了 dll 中的所有 C++ 样式代码并将其替换为 C 等效代码,它仍然有效。

但是,当我将文件从 X.cpp 重命名为 Xc(我猜这会导致在 C 模式下编译)时,对于 dll 中的每个函数,我都会收到错误 LNK2019(未解析的外部符号)。出于我的目的,dll 必须使用 C 而不是 C++,因为这是 Java Native Access 所支持的。

这是dll的标题:

__declspec(dllexport) double Add(double a, double b);
__declspec(dllexport) double Subtract(double a, double b);
__declspec(dllexport) double Multiply(double a, double b);
__declspec(dllexport) double Divide(double a, double b);

这是使用 dll 的 (C++) 测试程序的主体:

#include <iostream>
#include "MyMathFuncs.h"
using namespace std;
int main()
{
    double a = 7.4;
    int b = 99;

    cout << "a + b = " <<
        Add(a, b) << endl;
    cout << "a - b = " <<
        Subtract(a, b) << endl;
    cout << "a * b = " <<
        Multiply(a, b) << endl;
    cout << "a / b = " <<
        Divide(a, b) << endl;

    return 0;
}

(只是为了澄清测试程序在 C++ 中很好;它只是我试图用 C 编译的 dll)。

4

2 回答 2

4

添加

extern "C"
{
#include "MyMathFuncs.h"
}
于 2010-03-10T18:05:16.330 回答
1

更改扩展名后,您现在在客户端代码中使用了错误的名称。这些名称不再像您将其编译为 C++ 代码时那样进行修饰。像这样导出名称的正确方法,以便永远不会使用这些装饰并且您不依赖于语言:

extern "C" __declspec(dllexport)
double Add(double a, double b);

要查看导出的名称,请在 DLL 上使用 Dumpbin.exe /exports。

于 2010-03-10T18:23:17.360 回答