Pb de linkage

Pb de linkage - C++ - Programmation

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?

Reply

Marsh Posté le 08-09-2010 à 11:10:28   

Reply

Marsh Posté le 08-09-2010 à 11:32:32    

si ta fonction est définie dans le header, tu peux éventuellement la marquer inline.
 
Montre nous tes fichiers, ce sera plus simple pour cerner le souci


---------------
last.fm
Reply

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à)

Reply

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.

Reply

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

Reply

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


---------------
last.fm
Reply

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.


Message édité par h3bus le 08-09-2010 à 13:39:40

---------------
sheep++
Reply

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

Reply

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.


---------------
last.fm
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed