Newsgroup: it.comp.programmare.win32
Titolo: VC++ errore di Linking: aiuto!

Scusate. Prima probabilmente non sono stato molto preciso.
Sto lavorando con VC++6
facendo il Build del progetto ottengo i seguenti errori
Linking...
nafxcwd.lib(afxmem.obj) :
error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)
already defined in LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj) :
error LNK2005: "void __cdecl operator delete(void*)" (??3@YAXPAX@Z)
already defined in LIBCMTD.lib(dbgdel.obj)
Debug/MCLSimulator.exe : fatal error LNK1169: one or more multiply
definedsymbols found
Error executing link.exe.
Non so come proprio come risolverlo anche perche'  prima l'applicazione
funzionava :
L'unica cosa che ho cambiato e' che invece di creare degli oggetti di una
certa classe TipoX
con TipoX oggetto(....)
uso l'operatore new mantenendo un puntatore all'oggetto
TipoX * pOggetto = new TipoX(....);
Immagino potrebbe essere una impostazione sbagliata sui barametri di linking
ma non saprei dove andare a cercare.
Qualche suggerimento?
Grazie 1000.
Ciao
Mau.

"Maurice" <maz...@in.wind.it.notvalid> ha scritto nel messaggio
news:ZNeu9.75876$RO.19...@twister1.libero.it...

Controlla come hai sistemato le parentesi graffe o se non ti sei dimenticato
un punto e virgola.
Magari sintatticamente è corretto e il compilatore di crea l'obj però il
link sta interpretando la tua istruzione come una redefinizione
dell'operatore newe dell'operatore Delete.
Forse non hai nel metodo in cui richiami il new messo il nome della classe
sulla definizione dello stesso (dovrei vedere il codice per darti una mano
ora sto tirando ad indovinare).


controllato: i nomi delle classi ci sono....
ho trovato queste  definizioni (inserite da VC++): poosono essere loro il
problema?
non ne ho trovate di analoghe per delete.....
D:\Documents and
Settings\mauro\Desktop\CodiceSistemato\SimulatoreGrafico\MCLSimulator\Config
ureDlg.cpp(9):#define new DEBUG_NEW
D:\Documents and
Settings\mauro\Desktop\CodiceSistemato\SimulatoreGrafico\MCLSimulator\MCLSim
ulator.cpp(9):#define new DEBUG_NEW
D:\Documents and
Settings\mauro\Desktop\CodiceSistemato\SimulatoreGrafico\MCLSimulator\MCLSim
ulatorDlg.cpp(11):#define new DEBUG_NEW

un punto e virgola
Comunque ora ricontrollo il codice e cerco eventuali errori che mi sono
sfuggiti
Intanto ciao e grazie.

Non ho ancora risolto il problema e sono sempre piu confuso sulla possibile
causa.
Ho commentato tutte le mie chiamate agli operatori new e delete e il build
va a buon fine
Poi ad una ad una ho tolto i commenti e ho scoperto che, apparentemente, i
problemi sono dati _solo_ quando
chiamo new per creare un vettore, sia di oggetti che ho definito io tramite
classi sia in una chiamata
di new per creare un vettore di unsigned int.
Quando decommento una di queste chiamate l'errore di link ricompare....
Tutte queste chiamate di new sono in file "esterni" che ho scritto fuori da
VC++
Quello che mi appare piu' strano e' che se compilo e faccio link solo di
tali file con gcc
tutto va bene, non mi da nessun problema.
Non sono esperto ma penso che questo possa significare che quello che ho
scritto e giusto
a questo punto non so proprio cosa fare.
riporto alcune delle chiamate che mi danno problemi (le altre sono simili):
Point , Sample e ModelGL sono classi definite in file .h che includo come
file esterni
(per le quali non ho ridefinito l'operatore new.. che sia questo il
problema???....)
Point * path =  new Point[lungPath];
 Sample ** pSample = new Sample *[ numY ];
for ( k=0; k<numY; k++)
        {          pSample[k]= new Sample [ numX ];       }
Sample *  pSample = new Sample [ NSample ];
unsigned int *  pObservation = new unsigned int[nPoint];
Inoltre le seguenti chiamate a new _non_ danno problemi:
ModelGL * m_pModelGL = new ModelGL(envTemp,preModelGLTemp,NSAMPLE);
Point * ppoint=new Point;
L'operatore delete causa errore di linking in alcuni casi quando lo richiamo
esplicitamente su uno dei
puntatori allocati come sopra ad esempio su
delete m_pModelGL;
Ci sono eventualmente delle impostazioni di compilazione  che posso aver
cambiato accidentalmente  o  degli header
che ho oppure non ho incluso e che potrebbere causare problemi?
Che posso fare?
Prego AIUTO!
Grazie comunque.
Ciao Mauro.

 Che posso fare?
IMHO se ridefinisci l'operatore di new dovresti ridefinire anche l'operatore
delete. agiscono in coppia come malloc e free.
Cmq ad essere sincero un problema del genere non me lo sono mai trovato di
fronte.
Inoltre č proprio necessario ridefenire l'operatore di new? Il polimorfismo
del costruttore non basta?
Al limite se non ci sono alternative ti offro di isolare la parte corrotta e
passarmela par controllare se incidono le impostazioni del linker. Piů che
altro perchč magari imparo qualcosa di nuovo.
Ciao

 altro perchè magari imparo qualcosa di nuovo.
Beh, saresti molto gentile ad aiutarmi.
Per parte corrotta intendi tutti i punti dove mi da errore?
e come posso fare per "isolare la parte corrotta?"
Ti invio i miei file "esterni" e tu provi ad usarli?
Grazie ancora.
Ciao.
P.S. Tanto per la cronaca ho effettuato delle prove compilando con gcc
e rinunciando alla simulazione grafica (mi "sputa fuori" i valori numerici)
e tutto va alla perfezione.....

 Ti invio i miei file "esterni" e tu provi ad usarli?
Se la cosa non è troppo complessa prova ad isolare la parte che ti crea
problemi.
Ad esempio istanziando sull'heap la classe che ti crea il problema del
linking in un nuovo progetto (io li chiamo programmi scuff). Appena
riproduci l'errore passami i files (cerca di ridurre il numero di righe di
codice al massimo) che cerco di capire di cosa si tratti, altrimenti così a
naso ho esaurito le mie idee.
contattami pure in pvt.
Ciao