2010-03-10 4 views
1

J'ai traversé la dll walkthrough sur MSDN et cela fonctionne très bien. J'ai ensuite supprimé tout le code de style C++ dans la DLL et l'a remplacé par l'équivalent C, et cela fonctionne toujours. MAIS, quand je renomme le fichier de X.cpp en X.c (ce que je devine provoque la compilation en mode C), j'obtiens l'erreur LNK2019 (symbole externe non résolu) pour chaque fonction dans la DLL. Pour mes besoins, il est essentiel que la DLL soit en C et non en C++ car c'est ce que Java Native Access supporte.écrire un dll dans Visual Studio en C (pas C++) causant des symboles non résolus

est ici 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); 

est ici 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++, c'est seulement la DLL que j'essaye de compiler en C).

+0

après MyFuncs.h svp (question rapide, vous avez utilisé extern "C" ... correct?) – KevinDTimm

Répondre

4

Ajouter

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

ou mieux mettre l'externe "C" dans le fichier d'en-tête – Mark

+2

Oui, vous pouvez faire le #ifdef __cplusplus extern " C "chose dans l'en-tête –

+0

Génial merci! Le fichier est maintenant compilé avec le fichier source dll appelé X.c. Et pourtant JNA ne peut toujours pas charger la DLL correctement :( Je publierai cela comme un problème distinct quand j'ai plus d'informations. –

1

Après avoir changé l'extension, vous utilisez maintenant les noms erronés dans le code client. Ces noms ne sont plus décorés comme ils l'étaient lorsque vous l'avez compilé en tant que code C++. La bonne façon d'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.

Questions connexes