написание dll в Visual Studio на C (не C++), вызывающее неразрешенные символы
-
19-09-2019 - |
Вопрос
Я проходил прохождение dll на MSDN и он работает нормально.Затем я удалил весь код стиля C++ из dll и заменил его эквивалентом C, и он все еще работает.
НО, когда я переименовываю файл из X.cpp в X.c (что, я думаю, вызывает компиляцию в C-режиме), я получаю ошибку LNK2019 (неразрешенный внешний символ) для каждой функции в dll.Для моих целей важно, чтобы 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);
Вот тело программы тестирования (C++), использующей dll:
#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++; это нормально;это всего лишь DLL, которую я пытаюсь скомпилировать в C).
Решение
Добавлять
extern "C"
{
#include "MyMathFuncs.h"
}
Другие советы
После того как вы изменили расширение, вы теперь используете неправильные имена в клиентском коде.Эти имена больше не оформляются так, как это было при компиляции кода C++.Правильный способ экспорта таких имен, чтобы эти украшения никогда не использовались и не зависели от языка:
extern "C" __declspec(dllexport)
double Add(double a, double b);
Чтобы просмотреть экспортированные имена, используйте Dumpbin.exe /exports в своей DLL.