Décorations des fonctions

Signaler
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
-
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
-
Bonjour,

J'utilise MSVC et MinGW pour compiler des DLLs. Avec MinGW, je supprime les décorations grâce à une option du compilateur (ce qui m'épargne la maintenance fastidieuse d'un fichier .def), mais je n'ai pas retrouvé cette option dans MSVC... Existe-t'elle et si oui, quelle est-elle ?

Actuellement je demande à MinGW de générer le fichier .def après la compilation de la DLL et je l'utilise pour la recompiler avec MSVC, mais je trouve cette solution moyennement satisfaisante...

Merci d'avance.

8 réponses

Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Ajoute extern "C" avant le nom de tes fonctions, ca indiquera au compilateur de générer des décorations sur le nom de tes fonctions.

Shell
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Erreur je viens de me relire.

Le extern "C" indique au compilateur de ne pas générer de décorations.
Tu as juste à l'ajouter avant le nom de tes fonctions dans ta DLL.

Shell
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Je compile en mode C (/TC), avec le extern "C" il me sort une error C2059: syntax error : 'string'
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Normal, la directive extern "C" {...} est spécifique au C++.
Essaye ca :

#if defined(_cplusplus)
#extern "C" {
#endif
int MyFunc1(int Param1);
int MyFunc1(int Param1);
// tu listes tes autres fonctions présentent dans le .c
#if defined(_cplusplus)
}
#endif


Shell
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Moui je vois le principe, mais çà ne changera rien aux décorations de mes fonctions : toute la DLL est compilée en mode C (donc _cplusplus ne sera pas définie), et les exports sont de la forme _fonction@n ou fonction est une fonction et n la taille de ses arguments...

Par contre c'est bon à savoir pour être compatible avec C++, merci.
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Oui en effet.
Ce que tu peux faire, c'est de compilé ta DLL en mode C++ en ajoutant la directive extern "C".
Les programmes ainsi codé en C, pourront acceder aux fonctions de la DLL.

Sinon vaudrait voire avec BruNews s'il existe un moyen de désactiver les décorations des options du compiler.

Shell
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Je suis tombé sur quelques article qui mentionne que l'utilisation du .def en l'incluant a ton workspace, te permet de ne pas avoir a utiliser les décorations.
Si tu dois modifier le nombre et le type de tes params, il te faudra alors aussi modifier le .def.

Essaye de voir sur google, il y a quelque thread qui traite de ca.

Shell
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Ben j'ai passé la soirée à éplucher soigneusement chaque switch de cl.exe et link.exe, aucun ne mentionne cette option fantôme (par contre; y'en a des forts intéressantes - surtout pour l'optimisation du code).

Tant pis, je continuerais à générer le .def à partir de la sortie de GCC. Merci quand même !