Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : LNK2005 Already defined erreur [ Archives / Au secours ] (mortiis)

lundi 20 décembre 2004 à 23:05:20 | LNK2005 Already defined erreur

mortiis


Bonjour à tous

Je fait un projet win32 et il y a 3 fichiers

main.cpp ou il y a la fonction WinMain
PMKApp.h ou il y a la déclaration de la classe CPMKApp
PMKApp.cpp ou il y a le code des méthodes de la classe CPMKApp

dans le fichier PMKApp.h à la suite de la déclaration de la classe, je déclare un objet du type de cette classe :
#ifndef GAPP
#define GAPP
CPMKApp * g_pPMKApp; //Objet de l'application
#endif

dans le fichier main.cpp j'inclu le fichier PMKApp.h
#include "PMKApp.h"

voici le message d'erreur :

PackMan Killer error LNK2005: "class CPMKApp * g_pPMKApp" (?g_pPMKApp@@3PAVCPMKApp@@A) already defined in main.obj

Si je ne déclare pas l'objet g_pPMKApp sa ne fait pas l'erreur.

Je ne comprend pas trop pourquoi.

Merci pour le temps et l'aide.

lundi 20 décembre 2004 à 23:37:56 | Re : LNK2005 Already defined erreur

Nebula

Membre Club
Hum tu as du oublier de le déclarer extern peut-être (sans conviction, moi je fais plutôt du C, mais ton erreur y ressemble)

mardi 21 décembre 2004 à 04:29:03 | Re : LNK2005 Already defined erreur

mortiis

Merci pour ta réponse, mais je ne comprend pas ce que tu veut dire, car moi quand j'utilise le mot clé extern c'est pour des fonction exportable dans un dll.
extern "C" __declspec(dllexport) ...
Mais la c'est rien que je veut exporter d'un dll alors je sait pas trop ce que tu veut dire, car je ne connait pas d'autres utilités au mot clef extern .

Merci pour tes précisions.

mardi 21 décembre 2004 à 06:30:38 | Re : LNK2005 Already defined erreur

Nebula

Membre Club
Cela s'utilise aussi pour déclarer un objet dans un fichier .h, de manière à ce que les fichiers .c qui l'utilisent sachent que cette variable leur est accessible bien qu'elle soit déclarée et implémentée ailleurs...

Exemple : un fichier foo.c implémente une fonction f(), qui est utilisée dans bar.c Si on déclare f() dans le .h, on aura une erreur comme celle que tu as : elle est déclarée deux fois (une fois par inclusion du .h, en fait).

La solution consiste à mettre dans le .h :

extern int f(int); // déclaration extern de f() dans foo.h

Dans foo.c :

#include "foo.h"

int f(int n) {
return n * n;
}

Et enfin, dans bar.c :

#include "foo.h"

int main(void) {
printf("%i\n", f(36));
return 0;
}

Exemple simpliste mais qui permet de cerner le problème. Après en C++, j'ignore si cela suffit, mais y'a rien à perdre à essayer :p

mardi 21 décembre 2004 à 07:22:19 | Re : LNK2005 Already defined erreur

mortiis

Ok merci pour les explication c'est très clair.
Par contre dans mon cas sa ne m'aide pas, car j'ai essayer et dans ce cas sa me donne ce message d'erreur :

PackMan Killer error LNK2001: unresolved external symbol "class CPMKApp g_PMKApp" (?g_PMKApp@@3VCPMKApp@@A)

Il ne le trouve plus

mardi 21 décembre 2004 à 09:04:54 | Re : LNK2005 Already defined erreur

ymca2003

ne JAMAIS déclarer de variables dans un .h même avec des balises #ifdef/#endif, cela provoque la multiple définition de la variable lors de l'inclusion par plusieurs fichiers sources (la compilation passe mais pas l'édition de lien).

pour s'en sortir :
dans UN fichiers .c/.cpp :
CPMKApp * g_pPMKApp; //Objet de l'application

dans les AUTRES :
extern CPMKApp * g_pPMKApp; //Objet de l'application


mardi 21 décembre 2004 à 15:31:59 | Re : LNK2005 Already defined erreur

mortiis


Merci beaucoup.
Je fait sa finalement, mais dans le .h sa m'évite d'avoir à réécrire : à chaque fois.

Dans main.cpp je met :
#define MAINAPP
#include "PMKApp.h"

dans PMKApp.h je met :
#ifdef MAINAPP
#define EXTERN extern
#else
#define EXTERN
#endif
EXTERN CPMKApp g_PMKApp; //Objet de l'application

dans tous les autres fichier.cpp
#include "PMKApp.h"

Et tout sa fonctionne très bien et comme le seul endroit ou j'utilise cette variable c'est la ou le .h est inclus alors sa m'évite de la redéclarer chaque fois.

mardi 21 décembre 2004 à 15:34:53 | Re : LNK2005 Already defined erreur

ymca2003

Ou alors, tu le définit toujours en tant que extern dans le .h et tu le met dans un des .c/.cpp sans la mot clé extern (le main par ex).

mercredi 22 décembre 2004 à 14:46:17 | Re : LNK2005 Already defined erreur

plus_plus_fab

extern c'est crade en C++. Il faut faire autrement, sinon c'est du (mauvais ?) C.
Je ne peux pas te donner une réponse précise, mais si tu as besoin de faire ça, alors ta conception objet est à revoir :(

mercredi 22 décembre 2004 à 14:49:03 | Re : LNK2005 Already defined erreur

ymca2003

C'est vrai que les variables globales peuvent être mis en static dans une classe et accéder facilement comme cela :

CPMKApp::g_PMKAppk;



Cette discussion est classé dans : erreur, classe, pmkapp, cpmkapp, ppmkapp


Répondre à ce message

Sujets en rapport avec ce message

Inline asm + classe = erreur! [ par Darkneon ] Salut a tous.Lorsque je mets du codes assembleur dans ma classe le compilateur me renvoit l'erreur suivante."Inline assembly not allowed in inline and erreur dans la classe [ par Miss1 ] je n'arrive pas a compiler. le sujet est de crée une taille, un pointeur sur le 1er element du tableau, un constructeur, un constructeur par recopie , Erreur de segmentation... Qu'est ce que c'est ??? :o [ par Rouliann ] Salut tout le monde j'ai un gros problème et malgré tous mes essais je n'arrive pas à le résoudre... Il n'y a pas d'erreurs à la compilation mais lors Sous classer plusieurs controles dans une classe [ par julien_boss ] Bonjour,je vous détail l'ossature de ma classe, qui crée une fenetre :jappelle une methode Create() qui va ... créer la fenetre, je fais passer dans l probleme de compilation DEBUG ERROR DAMAGE AFTER NORMAL BLOCK [ par ali_saguer1 ] Bonjour, Il se trouve que j'ai un projet en C++ et je suis complètement bloqué. A la fin de l'exécutionde mon projet , j'obtient le resultat que j'ai erreur variable dans une classe [ par pumab12 ] voila jai un probleme :: class SPEC Player : public Unit{    friend class WorldSession;    public:        explicit Player (WorldSession *session);     redefinition de classe [ par k1koo ] bonjour j'ai un problème dès que je compile mon programme il me répond que je redéfinie mes classes : CComSerie.h:45: erreur: redefinition of 'class C Aide avec les template: comment implémenter élégamment une propriété avec getter/setter en C++? [ par Forman ] Bonjour à tous,je n'ai pas commencé le C++ depuis très longtemps donc désolé si ma question parait trop naïve. J'ai cherché à de nombreux endroits une la sérialisation d'un objet d'une classe appartient à une DLL [ par belallioui ] Bonjour,Je veux sérialiser un objet qui n'est pas serialisable (ne possede pas la fonction Serialise() ) dont sa classe mere et inconue, c a d, je con


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.