написание dll в Visual Studio на C (не C++), вызывающее неразрешенные символы

StackOverflow https://stackoverflow.com/questions/2419306

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top