C++ errore in fase di link
Moderatore: Staff
Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- N1cuz
- Linux 2.x

- Messaggi: 333
- Iscritto il: lun 6 ott 2008, 0:41
- Nome Cognome: Nicola Bartolomei
- Slackware: 14.1
- Kernel: 4.3.3
- Desktop: xfce4
- Località: Pieve a Nievole (PT)
Re: C++ errore in fase di link
... Aggiungo che BasketTest.cpp (dove testo le classi ralative ai giocatori) viene compilato ed eseguito perfettamente...
- Blizzard
- Master

- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
Re: C++ errore in fase di link
ciao,
gli errori di definizione multipla possono dipendere da qualche problema nelle include.
Ogni file .h è nella forma
#ifndef _FOO_
#define _FOO_
class Foo
{
...
};
#endif
Altrimenti con due include il preprocessore copia 2 volte l'interfaccia della classe.
comunque stiamo giocando un po a "Il Buono, il Brutto e il Cattivo" nel senso che tu sai il codice e non sai qual'è l'errore ed io posso immaginare l'errore ma non so come è il codice (e poi c'è il terzo con la pistola scarica
)
ciao
Gio
gli errori di definizione multipla possono dipendere da qualche problema nelle include.
Ogni file .h è nella forma
#ifndef _FOO_
#define _FOO_
class Foo
{
...
};
#endif
Altrimenti con due include il preprocessore copia 2 volte l'interfaccia della classe.
comunque stiamo giocando un po a "Il Buono, il Brutto e il Cattivo" nel senso che tu sai il codice e non sai qual'è l'errore ed io posso immaginare l'errore ma non so come è il codice (e poi c'è il terzo con la pistola scarica
ciao
Gio
- N1cuz
- Linux 2.x

- Messaggi: 333
- Iscritto il: lun 6 ott 2008, 0:41
- Nome Cognome: Nicola Bartolomei
- Slackware: 14.1
- Kernel: 4.3.3
- Desktop: xfce4
- Località: Pieve a Nievole (PT)
Re: C++ errore in fase di link
Blizzard ha scritto: comunque stiamo giocando un po a "Il Buono, il Brutto e il Cattivo" nel senso che tu sai il codice e non sai qual'è l'errore ed io posso immaginare l'errore ma non so come è il codice (e poi c'è il terzo con la pistola scarica)
ciao
Gio
comunque il problema non credo sia di definizione multipla dell' header fileBlizzard ha scritto:ciao,
gli errori di definizione multipla possono dipendere da qualche problema nelle include.
Ogni file .h è nella forma
#ifndef _FOO_
#define _FOO_
class Foo
{
...
};
#endif
Altrimenti con due include il preprocessore copia 2 volte l'interfaccia della classe.
Codice: Seleziona tutto
HashTest.o: In function `__tcf_3':
/home/nico/Finf_II/C++/Project/MyString.h:254: multiple definition of `PlayMaker::p'
HashTable.o:/home/nico/Finf_II/C++/Project/MyString.h:116: first defined here
collect2: ld returned 1 exit status
make: *** [HashTest] Error 1Comunque dopo riguarderò tutti i file uno ad uno, grazie mille gio.
Nico
Ultima modifica di N1cuz il mer 7 gen 2009, 16:41, modificato 2 volte in totale.
- Blizzard
- Master

- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
Re: C++ errore in fase di link
ciao,
forse ho capito... in teoria hai fatto una cosa simile giusto?
edit... ho confuso un po di cose
giusto?
Questa dovrebbe essere una inizializzazione standard di un membro statico
forse ho capito... in teoria hai fatto una cosa simile giusto?
edit... ho confuso un po di cose
Codice: Seleziona tutto
class PlayerMaker
{
private:
....
.....
static MyString<char> p; //questa è la linea 116
public:
PlayerMaker();
};
MyString<char> PlayerMaker::p= <quello che vuoi>; //o qualcosa del genere alla linea 254
Questa dovrebbe essere una inizializzazione standard di un membro statico
- N1cuz
- Linux 2.x

- Messaggi: 333
- Iscritto il: lun 6 ott 2008, 0:41
- Nome Cognome: Nicola Bartolomei
- Slackware: 14.1
- Kernel: 4.3.3
- Desktop: xfce4
- Località: Pieve a Nievole (PT)
Re: C++ errore in fase di link
si esattamente, perchè sui libri ho studiato abbastanza, mentre al livello di pratica sono praticamente un neofita, quindi cerco di attenermi il più possibile alla metodologia standard "scolastica"(come l'aggiunta dell'inutile 1 nell' #ifndef)...Blizzard ha scritto:ciao,
forse ho capito... in teoria hai fatto una cosa simile giusto?
edit... ho confuso un po di cose
giusto?Codice: Seleziona tutto
class PlayerMaker { private: .... ..... static MyString<char> p; //questa è la linea 116 public: PlayerMaker(); }; MyString<char> PlayerMaker::p= <quello che vuoi>; //o qualcosa del genere alla linea 254
Questa dovrebbe essere una inizializzazione standard di un membro statico
-
mr_hyde
- Linux 0.x

- Messaggi: 66
- Iscritto il: dom 5 nov 2006, 14:02
- Slackware: current (>= 13)
- Località: Genova
Re: C++ errore in fase di link
Io la butto li': non e' che il problema lo hai perche':
1) hai sia dichiarazione che inizializzazione nell'header file
2) quel'header file e' incluso da piu' file sorgenti .cxx.
In questo modo la COMPILAZIONE dei singoli file .cxx dovrebbe andare bene, ma quando fai il link mi sa che "trova" due volte l'inizializzazione della stessa var.
In genere, per evitare questi problemi, l'inizializzazione si mette in un file separato (o nel .cxx dove ci sono le implementazioni), in questo modo si e' sicuri che l'inizializzazione vada a finire in un unico file oggetto.
Vedi ad esempio http://www.eng.usyd.edu.au/tutorial/cou ... lus07.html
Ciao,
Mr Hyde
1) hai sia dichiarazione che inizializzazione nell'header file
2) quel'header file e' incluso da piu' file sorgenti .cxx.
In questo modo la COMPILAZIONE dei singoli file .cxx dovrebbe andare bene, ma quando fai il link mi sa che "trova" due volte l'inizializzazione della stessa var.
In genere, per evitare questi problemi, l'inizializzazione si mette in un file separato (o nel .cxx dove ci sono le implementazioni), in questo modo si e' sicuri che l'inizializzazione vada a finire in un unico file oggetto.
Vedi ad esempio http://www.eng.usyd.edu.au/tutorial/cou ... lus07.html
Ciao,
Mr Hyde
- N1cuz
- Linux 2.x

- Messaggi: 333
- Iscritto il: lun 6 ott 2008, 0:41
- Nome Cognome: Nicola Bartolomei
- Slackware: 14.1
- Kernel: 4.3.3
- Desktop: xfce4
- Località: Pieve a Nievole (PT)
Re: C++ errore in fase di link
L'hai buttata al posto giusto!! Ti sono debitore Mr.Hyde, anche se dall'output era intuibile (... col senno di poi soprattutto!) non c'ero proprio arrivato e dubito che ce l'avrei fatta senza il tuo "assist".mr_hyde ha scritto:Io la butto li': non e' che il problema lo hai perche':
1) hai sia dichiarazione che inizializzazione nell'header file
2) quel'header file e' incluso da piu' file sorgenti .cxx.
In questo modo la COMPILAZIONE dei singoli file .cxx dovrebbe andare bene, ma quando fai il link mi sa che "trova" due volte l'inizializzazione della stessa var.
Adesso finalmente sono riuscito ad ottenere un'eseguibile, anche se l'ultimo interrogativo che mi è rimasto è (... e mi rendo conto di aver abbondantemente rotto i balle...) se c'è un limite massimo di files oggetto che il linker riesce a mettere insieme correttamente.
Questo dubbio mi è venuto notando che se linko 5 object files (BasketPlayer.o Center.o GuardWing.o PlayMaker.o Main.o) l'eseguibile funziona correttamente, se invece ne linko 6 (i soliti 5 + HashTable.o, semplicemente spostando l'implemetazione delle funzioni della classe HashTable in un file a parte .cpp) l'esecuzione mi da un "Segmentation fault".
Non essendoci errori di sintassi (e mi pare nemmeno logici, ma spero di sbagliarmi) sono portato a pensare (non trovando spiegazione) che il problema sia nel "numero" di files .cpp, anche se questo mi pare piuttosto improbabile (per non dire "non ci credo")...
In ogni caso ringrazio veramente di cuore tutti quelli che hanno partecipato al post, gli utilissimi link e tutto il resto, grazie ancora ciao.
-Nico