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++.