Retourner aux forums || Retourner au forum Programmation.c
Programmation.c : Gcc, les symboles, les underscores, et windows
Posté par cho7 (page perso, ) le 26 avril 2005en compilant un programme maison ce matin au taf via cygwin, j'ai été obligé de retirer l'underscore qui débutait chacun des noms de mes variables externes, car gcc semblait me le rajouter à la compilation dans la table des symboles
Ainsi, si j'avais un export char _plop, après compilation
nm me trouvait le symbole __plop. Plutot génant pour linker ensuite, c'est ainsi que ld plantait lamentablement en me sortant un undefined reference to __plop
Bref, pourquoi ?
Merci.
le python, c'est bon
ABI C definie sur l'OS.
Sous Win32 l'ABI C impose de prefixer tout symbole par un underscore lorsque celui ci utilise la convention d'appel C standard.
De meme les symboles utilisant la convention stdcall (toute l'api win32 par ex), ne prefixe pas, mais ajoute un suffixe @${n} ou n est la taille totale prise par les arguments sur la pile si je me souviens bien.
Sous GNU/Linux, l'ABI C suivie n'est pas la meme.
Voila la raison :-)
En general, la solution consiste à avoir une macro:
#if defined ( _WIN32)
SYMBOL_NAME(symbol_name) _##symbol_name
#else if defined (__linux__)
SYMBOL_NAME(symbol_name) ##symbol_name
#else
#error SYMBOL_NAME not defined !!!
#endif
Je te laisse en exercise le soin de corriger les erreurs eventuelle de cette macro non testée.
-
[^]Re: ABI C definie sur l'OS.
Posté par cho7 (page perso, ) le 26/04/2005 à 16:40. (lien). Évalué à 2.Voila la raison :-)
Merci beaucoup, explication simple et efficace :)--
le python, c'est bon
[+] y a pas à tortiller
les symboles qui commencent ou finissent par un underscore sont réservés à l'implémentation. Donc n'utilise pas ce genre de choses.
-
[^]Re: y a pas à tortiller
Posté par gc (page perso, ) le 27/04/2005 à 11:23. (lien). Évalué à 2.Euh, tu peux me trouver une référence de cette affirmation ?
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.