escribir un archivo DLL en Visual Studio en C (no C ++) causando símbolos sin resolver

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

  •  19-09-2019
  •  | 
  •  

Pregunta

He estado yendo a través del tutorial DLL en MSDN y funciona bien. entonces me quita todo el código de estilo ++ C en el archivo DLL y lo reemplazó con el equivalente de C, y todavía funciona.

Pero, cuando cambio el nombre del archivo desde X.cpp a X.c (que supongo causas compilación en C-mode), me sale error LNK2019 (símbolo externo sin resolver) para cada función en la DLL. Para mis propósitos es esencial que la DLL sea en C no C ++ porque eso es lo que es compatible con Java acceso nativo.

Este es el encabezado del archivo 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);

Aquí está el cuerpo del programa de pruebas (C ++) que utiliza la 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;
}

(Solo para aclarar que está bien que el programa de pruebas está en C ++, es sólo el DLL que estoy tratando de compilar en C)

.
¿Fue útil?

Solución

Añadir

extern "C"
{
#include "MyMathFuncs.h"
}

Otros consejos

Después de cambiar la extensión, que ahora está utilizando los nombres equivocados en el código de cliente. Esos nombres ya no están decoradas como lo eran cuando se ha compilado como código C ++. La forma correcta para exportar nombres como éste, de manera que nunca se usan esas decoraciones y no depende de la lengua:

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

Para ver los nombres exportados, utilice Dumpbin.exe / exportaciones en el archivo DLL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top