2

我用MinGW编译了一个dll。为此,我使用了以下命令:

gcc -shared -o MathsDll.dll MathsDll.c -Wl,--output-def,MathsDll.def,--out-implib,libMathsDll.a

lib /machine:i386 /def:MathsDll.def

然后我尝试从 C 代码中使用该 dll。我的编译命令如下:

cl mainCode.c MathsDll.lib

它适用于这种情况,但是当我将 mainCode.c 文件更改为 mainCode.cpp 时出现错误:

mainCode.obj:错误 LNK2019:未解析的外部符号“__declspec(dllimport) int _ cdecl add(int,int)”( _imp_?add@@YAHHH@Z)在函数 _main mainCode.exe 中引用:致命错误 LNK1120:1 个未解析的外部

为什么那个 dll 在 C 代码而不是 C++ 中工作?

顺便说一句,我使用了 MinGW 的网站作为参考。 http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs

主代码.cpp:

#include <stdio.h>
#include "MathsDll.h"

int main()
{
printf("%d",add(3,4));
}

MathsDll.h:

#ifdef MATHDLL_EXPORTS
#define MATHDLL_API extern "C" __declspec(dllexport) 
#else
#define MATHDLL_API __declspec(dllimport) 
#endif

MATHDLL_API int add(int,int);
MATHDLL_API int multiply(int,int);

MathsDll.c / MathsDll.cpp:

#include "MathsDll.h"

int add(int a,int b)
{
    return a+b;
}

int multiply(int a,int b)
{
    return a*b;
}
4

1 回答 1

2

如果您在用 C 语言或 C++ 语言模块访问的用 C 语言编写的 DLL 中的函数,您应该使用 __cplusplus 预处理器宏来确定正在编译的语言,然后使用 C 链接声明这些函数(如果正在使用)来自 C++ 语言模块。

http://msdn.microsoft.com/en-us/library/ys435b3s.aspx

于 2013-04-19T12:25:10.350 回答