2010-12-04 6 views
1

J'ai donc essayé de diviser mon jeu en plusieurs fichiers. Je reçois ces erreurs:Erreurs de lieur C++

1>item.obj : error LNK2005: "private: static class sf::Image ctile::itile" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>item.obj : error LNK2005: "class cmap maps" ([email protected]@[email protected]@A) already defined in character.obj 
1>item.obj : error LNK2005: "class cmainchar mainch" ([email protected]@[email protected]@A) already defined in character.obj 
1>item.obj : error LNK2005: "class citemmanager itemmanager" ([email protected]@[email protected]@A) already defined in character.obj 
1>item.obj : error LNK2005: "private: static class sf::Image citem::iitem" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>item.obj : error LNK2005: "private: static class sf::Image cspell::ispell" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>item.obj : error LNK2005: "class sf::RenderWindow App" ([email protected]@[email protected]@@A) already defined in character.obj 
1>item.obj : error LNK2005: "class sf::View View" ([email protected]@[email protected]@A) already defined in character.obj 
1>main.obj : error LNK2005: "private: static class sf::Image ctile::itile" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>main.obj : error LNK2005: "class cmap maps" ([email protected]@[email protected]@A) already defined in character.obj 
1>main.obj : error LNK2005: "class cmainchar mainch" ([email protected]@[email protected]@A) already defined in character.obj 
1>main.obj : error LNK2005: "class citemmanager itemmanager" ([email protected]@[email protected]@A) already defined in character.obj 
1>main.obj : error LNK2005: "private: static class sf::Image citem::iitem" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>main.obj : error LNK2005: "private: static class sf::Image cspell::ispell" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>main.obj : error LNK2005: "class sf::RenderWindow App" ([email protected]@[email protected]@@A) already defined in character.obj 
1>main.obj : error LNK2005: "class sf::View View" ([email protected]@[email protected]@A) already defined in character.obj 
1>map.obj : error LNK2005: "private: static class sf::Image ctile::itile" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>map.obj : error LNK2005: "class cmap maps" ([email protected]@[email protected]@A) already defined in character.obj 
1>map.obj : error LNK2005: "class cmainchar mainch" ([email protected]@[email protected]@A) already defined in character.obj 
1>map.obj : error LNK2005: "class citemmanager itemmanager" ([email protected]@[email protected]@A) already defined in character.obj 
1>map.obj : error LNK2005: "private: static class sf::Image citem::iitem" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>map.obj : error LNK2005: "private: static class sf::Image cspell::ispell" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>map.obj : error LNK2005: "class sf::RenderWindow App" ([email protected]@[email protected]@@A) already defined in character.obj 
1>map.obj : error LNK2005: "class sf::View View" ([email protected]@[email protected]@A) already defined in character.obj 
1>spell.obj : error LNK2005: "private: static class sf::Image ctile::itile" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>spell.obj : error LNK2005: "class cmap maps" ([email protected]@[email protected]@A) already defined in character.obj 
1>spell.obj : error LNK2005: "class cmainchar mainch" ([email protected]@[email protected]@A) already defined in character.obj 
1>spell.obj : error LNK2005: "class citemmanager itemmanager" ([email protected]@[email protected]@A) already defined in character.obj 
1>spell.obj : error LNK2005: "private: static class sf::Image citem::iitem" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>spell.obj : error LNK2005: "private: static class sf::Image cspell::ispell" ([email protected]@@[email protected]@@A) already defined in character.obj 
1>spell.obj : error LNK2005: "class sf::RenderWindow App" ([email protected]@[email protected]@@A) already defined in character.obj 
1>spell.obj : error LNK2005: "class sf::View View" ([email protected]@[email protected]@A) already defined in character.obj 
+5

Plutôt que de commencer avec * votre jeu *, je suggère d'essayer de prendre une simple application de style "hello world" et de la scinder en deux ou plusieurs fichiers. De cette façon, vous pouvez (a) afficher le code ici à titre d'exemple, et (b) comprendre plus facilement les concepts importants. Nous ne pouvons pas vous aider à déboguer votre code avec seulement une liste de messages d'erreur. –

Répondre

2

Le problème est que les définitions de vos fonctions membres de classe sont placées dans des fichiers d'en-tête. Ainsi, les mêmes définitions vont à séparer les unités de traduction.

Utilisez également include guards dans vos fichiers d'en-tête.

+1

Je veux vraiment baisser votre réponse. Peut-être qu'il n'a pas de gardes, mais les erreurs viennent de l'éditeur de liens, alors incluez les gardes qui ne le résoudront pas. – ybungalobill

+0

@ybungalobill: LNK2005 est une erreur de définition multiple. Donc, si l'OP inclut un fichier d'en-tête sans inclure les gardes plusieurs fois dans la même unité de traduction, l'éditeur de liens lancera cette erreur. L'ajout d'inclure des gardes permettra de résoudre ce problème. – Praetorian

+0

@ybungalobill Entièrement d'accord avec vous. J'ai corrigé la réponse. Il semble que je doive aller dormir :-) – Stas

4

Vous avez probablement vos définitions de méthode dans des fichiers .h. Par conséquent, vous avez de nombreuses copies d'une définition unique dans votre

Gardez les déclarations dans le fichier .h avec les inclusions:

#ifndef SOMETHING_H_ 
#define SOMETHING_H_ 

class Something { 
public: 
    int foo(); 
}; 

#endif // SOMETHING_H_ 

et les définitions méthode dans le fichier .cpp:

#include "Something.h" 

int Something::foo() { 
    return 5; 
} 
+0

J'ai des gardes d'en-tête, et il n'y a pas de méthodes dans mes en-têtes. – Yelnats

+1

Ensuite, vous faites quelque chose de mal. Regardez la première erreur: '1> item.obj: erreur LNK2005:" private: statique classe sf :: Image ctile :: itile "(? Itile @ ctile @@ 0VImage @ sf @@ A) déjà défini dans character.obj 'signifie fondamentalement que cette classe est définie à la fois dans' item.obj' (résultat de la compilation de item.cpp, je pressume) et dans 'character.obj'. Ceci est généralement "réalisé" en omettant d'inclure des gardes et je n'ai aucune idée de comment vous auriez pu le faire par accident autrement. Pouvez-vous poster ces fichiers (2x .cpp + en-tête avec cette classe)? – Kos

+0

J'ai découvert que le problème était que je déclarais les instances dans l'en-tête. – Yelnats

Questions connexes