написание DLL в Visual Studio в C (не C ++), вызывая неразрешенные символы - PullRequest
1 голос
/ 10 марта 2010

Я прошёл прохождение dll по MSDN , и он работает нормально.Затем я удалил весь код стиля C ++ в dll и заменил его на эквивалент C, и он все еще работает.

НО, когда я переименовываю файл из X.cpp в Xc (что, по-моему, вызывает компиляцию в 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).

Ответы [ 2 ]

4 голосов
/ 10 марта 2010

Добавить

extern "C"
{
#include "MyMathFuncs.h"
}
1 голос
/ 10 марта 2010

После того, как вы изменили расширение, вы теперь используете неправильные имена в коде клиента. Эти имена больше не оформлены, как это было, когда вы компилировали их как код C ++. Правильный способ экспортировать такие имена, чтобы эти украшения никогда не использовались и вы не зависели от языка:

extern "C" __declspec(dllexport)
double Add(double a, double b);

Чтобы увидеть экспортированные имена, используйте Dumpbin.exe / exports в вашей DLL.

...