Bonjour,
en 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.
# ABI C definie sur l'OS.
Posté par Edouard Gomez (site web personnel) . Évalué à 3.
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 (site web personnel) . Évalué à 2.
Merci beaucoup, explication simple et efficace :)
# y a pas à tortiller
Posté par TazForEver . Évalué à -1.
[^] # Re: y a pas à tortiller
Posté par gc (site web personnel) . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.