DLL, скомпилированная с MinGW, не работает в коде C++, который компилируется с помощью Visual Studio Compiler

Я скомпилировал dll с MinGW. Для этого я использовал команды ниже:

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

lib /machine:i386 /def:MathsDll.def

Затем я пытаюсь использовать эту DLL из кода C. Моя команда для компиляции ниже:

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

mainCode.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;
}

1 ответ

Решение

Если у вас есть функции в DLL, написанные на C, к которым вы хотите получить доступ из модуля языка C или языка C++, вы должны использовать макрос препроцессора __cplusplus, чтобы определить, какой язык компилируется, а затем объявить эти функции со связью C, если используется из модуля языка C++.

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

Другие вопросы по тегам