C++ errore in fase di link

Forum dedicato alla programmazione.

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.
Avatar utente
N1cuz
Linux 2.x
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

Messaggio da N1cuz »

... Aggiungo che BasketTest.cpp (dove testo le classi ralative ai giocatori) viene compilato ed eseguito perfettamente...

Avatar utente
Blizzard
Master
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

Messaggio da Blizzard »

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 :D)

ciao
Gio

Avatar utente
N1cuz
Linux 2.x
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

Messaggio da N1cuz »

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 :D)

ciao
Gio
:lol: è vero, è improbabile (a meno che tu non abbia poteri paranormali...) trovare un errore fatto da un altro senza avere il codice, tu hai fatto anche troppo!! E poi magari l'errore ce l'ho sotto gli occhi e non riesco a vederlo...
Blizzard 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.
comunque il problema non credo sia di definizione multipla dell' header file

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 1
come vedi l'errore di definizione multipla riguarda p, membro statico di tipo stringa di caratteri della classe PlayMaker che ho definito fuori dalla classe ma sempre dentro il file PlayMaker.h (e solo lì).
Comunque 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.

Avatar utente
Blizzard
Master
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

Messaggio da Blizzard »

ciao,
forse ho capito... in teoria hai fatto una cosa simile giusto?

edit... ho confuso un po di cose :D

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

giusto?
Questa dovrebbe essere una inizializzazione standard di un membro statico

Avatar utente
N1cuz
Linux 2.x
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

Messaggio da N1cuz »

Blizzard ha scritto:ciao,
forse ho capito... in teoria hai fatto una cosa simile giusto?

edit... ho confuso un po di cose :D

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

giusto?
Questa dovrebbe essere una inizializzazione standard di un membro statico
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)...

mr_hyde
Linux 0.x
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

Messaggio da mr_hyde »

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

Avatar utente
N1cuz
Linux 2.x
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

Messaggio da N1cuz »

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.
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".
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

Rispondi