Newsgroup: it.comp.lang.c++
Titolo: problema di linkage

Ciao a tutti,
avevo un unico file sorgente, che, essendo diventato molto grosso, ho
deciso di spezzare in più file.
Ma al momento della compoilazione ho incontrato un po' di problemi.
Spero che qualcuno mi possa dare una mano.
Il progetto è composto da questi file:
Globals.h (contiene costanti e variabili globali ed è incluso quasi in
tutti gli altri file)
KeyboardEventHandler.h
myCallback.h
rigidBody.h
KeyboardEventHandler.cpp
main.cpp
myCallback.cpp
rigidBody.cpp
Ognuno dei file .cpp include diversi file .h
Quando compilavo il programma ottenevo un sacco di errori relativi a
variabili definite o inizializzate più volte.
Così ho cercato in rete e sono finito su questa pagina (tutorial di
Paolo Marotta)
http://www.tutorialpc.it/c++9.asp
Seguendo quanto scritto lì ho inserito in ogni file header del mio
progetto delle linee di codice di questo tipo
#ifndef _GLOBALS_H
#define _GLOBALS_H
// codice di Globals.h
#endif
ma continuo ad avere lo stesso problema.
Se può essere di aiuto gli errori che ottengo sono questi (uso
VisualC++ 6.0 SP6)
Compiling...
main.cpp
Linking...
myCallback.obj : error LNK2005: "int  bodyCounter" (?bodyCounter@@3HA)
already defined in KeyboardEventHandler.obj
myCallback.obj : error LNK2005: "int  i" (?i@@3HA) already defined in
KeyboardEventHandler.obj
myCallback.obj : error LNK2005: "struct dxSpace *  space"
(?space@@3PAUdxSpace@@A) already defined in KeyboardEventHandler.obj
myCallback.obj : error LNK2005: "struct dxJoint * *  hinge"
(?hinge@@3PAPAUdxJoint@@A) already defined in KeyboardEventHandler.obj
myCallback.obj : error LNK2005: "double *  joint" (?joint@@3PANA)
already defined in KeyboardEventHandler.obj
myCallback.obj : error LNK2005: "struct dxJointGroup *  contactGroup"
(?contactGroup@@3PAUdxJointGroup@@A) already defined in
KeyboardEventHandler.obj
myCallback.obj : error LNK2005: "struct dxWorld *  world"
(?world@@3PAUdxWorld@@A) already defined in KeyboardEventHandler.obj
myCallback.obj : error LNK2005: "struct dxGeom *  ground"
(?ground@@3PAUdxGeom@@A) already defined in KeyboardEventHandler.obj
rigidBody.obj : error LNK2005: "int  bodyCounter" (?bodyCounter@@3HA)
already defined in KeyboardEventHandler.obj
rigidBody.obj : error LNK2005: "int  i" (?i@@3HA) already defined in
KeyboardEventHandler.obj
rigidBody.obj : error LNK2005: "struct dxSpace *  space"
(?space@@3PAUdxSpace@@A) already defined in KeyboardEventHandler.obj
rigidBody.obj : error LNK2005: "struct dxJoint * *  hinge"
(?hinge@@3PAPAUdxJoint@@A) already defined in KeyboardEventHandler.obj
rigidBody.obj : error LNK2005: "double *  joint" (?joint@@3PANA)
already defined in KeyboardEventHandler.obj
rigidBody.obj : error LNK2005: "struct dxJointGroup *  contactGroup"
(?contactGroup@@3PAUdxJointGroup@@A) already defined in
KeyboardEventHandler.obj
rigidBody.obj : error LNK2005: "class rigidBody * *  link"
(?link@@3PAPAVrigidBody@@A) already defined in myCallback.obj
rigidBody.obj : error LNK2005: "struct dxWorld *  world"
(?world@@3PAUdxWorld@@A) already defined in KeyboardEventHandler.obj
rigidBody.obj : error LNK2005: "struct dxGeom *  ground"
(?ground@@3PAUdxGeom@@A) already defined in KeyboardEventHandler.obj
main.obj : error LNK2005: "int  bodyCounter" (?bodyCounter@@3HA)
already defined in KeyboardEventHandler.obj
main.obj : error LNK2005: "int  i" (?i@@3HA) already defined in
KeyboardEventHandler.obj
main.obj : error LNK2005: "struct dxSpace *  space"
(?space@@3PAUdxSpace@@A) already defined in KeyboardEventHandler.obj
main.obj : error LNK2005: "struct dxJoint * *  hinge"
(?hinge@@3PAPAUdxJoint@@A) already defined in KeyboardEventHandler.obj
main.obj : error LNK2005: "double *  joint" (?joint@@3PANA) already
defined in KeyboardEventHandler.obj
main.obj : error LNK2005: "struct dxJointGroup *  contactGroup"
(?contactGroup@@3PAUdxJointGroup@@A) already defined in
KeyboardEventHandler.obj
main.obj : error LNK2005: "class rigidBody * *  link"
(?link@@3PAPAVrigidBody@@A) already defined in myCallback.obj
main.obj : error LNK2005: "struct dxWorld *  world"
(?world@@3PAUdxWorld@@A) already defined in KeyboardEventHandler.obj
main.obj : error LNK2005: "struct dxGeom *  ground"
(?ground@@3PAUdxGeom@@A) already defined in KeyboardEventHandler.obj
LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of
other libs; use /NODEFAULTLIB:library
Debug/hinge.exe : fatal error LNK1169: one or more multiply defined
symbols found
Error executing link.exe.
hinge.exe - 27 error(s), 1 warning(s)
Come posso risolvere questo problema?
Grazie 1000 in anticipo.
Bax

[...]
Probabilmente hai messo negli header file anche le definizioni e non solo le
dichiarazioni. Un simbolo puo essere dichiarato piu' volte ma definito una
soltanto. Se lo definisci in un header, e il simbolo ha external linkage, ti
ritrovi con una definizione per ogni unita' (file) di compilazione che
include l'header.
Per esempio, se in Globals.h hai messo:
  int bodyCounter;
hai definito (e anche dichiarato) il simbolo.
Nello header devi mettere solo la dichiarazione:
  extern int bodyCounter;
e poi in un solo .cpp la definizione (int bodyCounter).
Per fare una prova veloce, copia Globals.h in Globals.cpp (diventa il file
delle definizioni), e poi, in Globals.h,  aggiungi un extern davanti a tutti
i simboli definiti.


Ho fatto come hai detto e ora funziona tutto perfettamente.
Grazie 1000 davvero, mi hai salvato la vita!! :-))))
Ciao!
Bax