écrire un dll dans Visual Studio en C (non C ++) provoquant des symboles non résolus
-
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)
.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.