Pb de linkage - C++ - Programmation
Marsh Posté le 08-09-2010 à 11:35:29
Sous quelle forme? J'ai une 10aine de (petits) fichiers en tout, c'est pour ça que je vous ai épargné un copier/coller
Je pense que je vous mettrai tout ça dans un RAR ce soir (je suis pas sur mon PC là)
Marsh Posté le 08-09-2010 à 11:39:18
"load_image" est un nom assez banal, qui a peut-être été employé en deux endroits, mais pour faire des choses différentes, créant ainsi une possible ambiguité, qui pourrait peut-être être lévée par un choix d'un autre nom de fonction, ou par la spécification d'un namespace.
Marsh Posté le 08-09-2010 à 11:56:50
olivthill a écrit : "load_image" est un nom assez banal, qui a peut-être été employé en deux endroits, mais pour faire des choses différentes, créant ainsi une possible ambiguité, qui pourrait peut-être être lévée par un choix d'un autre nom de fonction, ou par la spécification d'un namespace. |
Je pense pas vu qu'à la base j'avais tout dans 1 seul fichier et que ça compillait très bien
En fait je crois que c'est parce que j'ai le corps de ma fonction load_image dans config.h, mais je comprends toujours pas pourquoi ça marche pas d
Marsh Posté le 08-09-2010 à 12:05:34
mets juste la déclaration de ta fonction dans config.h (mauvais choix de nom au passage) et le corps dans un fichier .cpp
Mettre le corps des fonctions dans les .h ne se justifie que pour les fonctions qui vont être inlinées ou pour les fonctions template
Marsh Posté le 08-09-2010 à 13:39:02
Je confirme ce que dit theshockwave.
Même si tu as mis les protections #ifndef dans ton header, si deux cpp font appel à ton header, ta fonction load_image se trouvera définie deux fois.
Le #define n'est pas conservé entre deux compilations successives, son scope est borné à son fichier et aux fichiers qui l'incluent.
Marsh Posté le 08-09-2010 à 13:53:11
Du coup comment est récupéré le corps de ma fonction load_image? Car à un moment il faut connaitre plus que son prototype
Marsh Posté le 08-09-2010 à 13:57:59
c'est justement le link qui fait le lien ... d'où le nom.
dans tes unités de compilation (les fichiers générés à partir de tes .c ou .cpp) il y a des symboles qui sont marqués comme internes (où le corps est présent dans l'unité) et d'autres symboles qui sont marqués externes. La résolution des symboles externes est faite lors du link.
Marsh Posté le 08-09-2010 à 11:10:28
Bonjour,
j'essaie pour la premiere fois de compiler en même temps plusieurs fichiers (un cpp par classe et un header), mais j'ai un soucis que je ne sais pas résoudre.
J'ai pour faire un test rapide une fonction globale appellée "load_image", que j'ai placé dans config.h qui contient aussi mes constantes
Mon fichier main inclu config.h
Mon fichier tileset.cpp pareil
Tous mes fichiers compilent bien, mais au niveau des liens j'ai l'erreur suivante :
Code :
1>TilesLayer.obj : error LNK2005: "struct SDL_Surface * __cdecl load_image(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > )" (?load_image@@YAPAUSDL_Surface@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) déjà défini(e) dans main.obj
que je ne comprend pas trop : a priori j'ai mis des "ifndef .... endif" dans mes includes, donc je comprend pas trop pourquoi est-ce que ma fonction veut se redéfinir à 2 endroits différents.
Bien sûr si je n'inclut plus config.h dans mon 2eme fichier, la compilation ne marche plus....
Une idée?