Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt : 5.10.0 - Qt Creator : 4.5.0 - Qt Installer : 3.0.2 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Dll : export de fonctions avec noms non décorés !

Bonjour,

Je cherche depuis pas mal de temps maintenant à exporter les fonctions de ma Dll avec des noms non décorés.

Voici le .h et le .cpp de la dll.

#ifndef CMD1_H
#define CMD1_H

#include "cmd1_global.h"
#include <string>
#include <iostream>

using namespace std;

class CMD1SHARED_EXPORT Cmd1 {
public:
Cmd1();
CMD1SHARED_EXPORT string GetName ();
CMD1SHARED_EXPORT int Action (void*);
};

#endif // CMD1_H

#include "cmd1.h"

Cmd1::Cmd1()
{
}

int Cmd1::Action(void *)
{
cout << "blabla" << endl;
return 0;
}

string Cmd1::GetName()
{
string a;
a = "nomdeladll";
return a;
}
Quand je compile avec ceci j'obtiens des noms de fonctions comme _ZN4Cmd17GetNameEv et _ZN4Cmd16ActionEPv au lieu de simplement "GetName" et "Action".
J'ai beaucoup cherché sur le net mais j'ai beau utiliser des __declspec rien n'y fait. Je les utilise peut être mal cela dit.
En revanche j'aimerais ne pas avoir à utiliser de .def si possible.
Je compile avec MingW, depuis QTCreator.

Pouvez-vous m'aider à résoudre ce problème ?

Réponses

  • December 2011 modifié
    en C++, les décoration des noms sont indispensables pour identifier la fonction à utiliser parmi les surcharges de celles-ci.
    ...Chose qui n'existe pas en C.

    C'est ainsi que pour assurer la compatibilité avec le C, il y a le mot clef extern suivi de "C", qui permet au linker de dire au linker "utilise la nomenclature C". Ainsi, dés que tu veut avoir la nomenclature C avec du code C++, tu dois faire ainsi:
    extern "C"
    {
    ///fonctions ou prototype de celles-ci
    }
    ...Par contre, je n'ai pas testé avec de fonctions membre, mais je suppose que ça va marcher.

    autre subtilité: sous windows, t'auras toujours un '_' devant le nom de ta fonction

    Remarque: dans les libs standards, c'est ce qu'il y a et ça permet d'utiliser les librairie du C avec du C++ de manière transparente.
  • December 2011 modifié
    Merci de ta réponse. J'avais entre temps demandé à quelqu'un d'autre, qui ma dit qu'il était sur le cul qu'un "extern C" compile suivi d'une déclaration de fonction membre (sachant que c'est du C ++).
    Et effectivement quand on y réfléchit ça n'a aucun sens de dire au compilateur "attention ce qui suit tu dois le traiter comme du C" alors que c'est de l'objet …
    Mais la solution que je cherchais (et comme un con je n'y avait pas pensé) c'est de faire ma dll en c++ mais sans faire d'objet ! Du coup ça passe nikel avec un "extern C" sur une fonction classique.
Connectez-vous ou Inscrivez-vous pour répondre.