écrire un dll dans Visual Studio en C (non C ++) provoquant des symboles non résolus

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

  •  19-09-2019
  •  | 
  •  

Question

J'ai traversais la procédure pas à pas dll sur MSDN et il fonctionne très bien. J'ai ensuite retiré tout le code de style C ++ dans le dll et remplacé par l'équivalent C, et il fonctionne encore.

Mais, quand je Renommez le fichier x.cpp à X.c (que je suppose que la compilation des causes en mode C-), je reçois LNK2019 d'erreur (symbole externe non résolu) pour toutes les fonctions de la dll. Pour mes besoins, il est essentiel que la dll soit en C ++ C pas parce que ce supporte Java Native Access.

Voici l'en-tête de la 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);

Voici le corps du (C ++) programme de test qui utilise 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;
}

(Juste pour préciser qu'il est bien que le programme d'essai est en C ++, il est seulement le dll que je suis en train de compiler en C)

.
Était-ce utile?

La solution

Ajouter

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

Autres conseils

Après avoir changé l'extension, vous utilisez maintenant les noms erronés dans le code client. Ces noms ne sont plus décorées comme ils étaient quand vous l'avez compilé code C ++. La bonne façon de exporter des noms comme celui-ci, de sorte que ces décorations ne sont jamais utilisées et vous ne dépendent pas de la langue:

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

Pour voir les noms exportés, utilisez Dumpbin.exe / exports sur votre DLL.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top