[C++] errore in compilazione

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.
Rispondi
kernel89
Linux 1.x
Linux 1.x
Messaggi: 146
Iscritto il: ven 16 feb 2007, 22:37
Slackware: 13
Desktop: kde
Località: Sassari / Pisa

[C++] errore in compilazione

Messaggio da kernel89 »

Ciao a tutti.
Come da titolo non riesco a compilare un codice sorgente in c++ costruito con dei moduli.
Vi faccio un esempio del codice (molto banale):

Codice: Seleziona tutto

// file princ.cpp
#include <iostream>
#include "intero.h"

int main(){
      int x=2;
      scrivi(x);
}

// file intero.h
void scrivi(int x);

// file intero.cpp
#include <iostream>
#include "intero.h"

void scrivi(int x){
    cout << x ;
}

Il codice che ho scritto sopra è tutto giusto, però quando compilo il file princ.cpp

Codice: Seleziona tutto

g++ princ.cpp
mi restituisce:

Codice: Seleziona tutto

/tmp/ccyTbTpC.o: In function `main':
princ.cpp:(.text+0x195): undefined reference to `scrivi(int)'
collect2: ld returned 1 exit status
Penso che io debba dare al compilatore delle direttive, ma non ho idea di quali siano!

Qualcuno/a mi può aiutare?

Grazie a tutti!

Avatar utente
JohnnyMnemonic
Staff
Staff
Messaggi: 2733
Iscritto il: dom 5 set 2004, 0:00
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos
Località: Bologna
Contatta:

Re: [C++] errore in compilazione

Messaggio da JohnnyMnemonic »

Codice: Seleziona tutto

// file princ.cpp
#include <iostream>
#include "intero.h"
int main(){
      int x=2;
      scrivi(x);
}

Codice: Seleziona tutto

// file intero.h
void scrivi(int x);

Codice: Seleziona tutto

// file intero.cpp

#include <iostream>
#include "intero.h"
using namespace std;
void scrivi(int x){
    cout << x ;
}

Codice: Seleziona tutto

g++ princ.cpp intero.h
Nota la modifica in intero.cpp

Avatar utente
m0rdr3d
Linux 2.x
Linux 2.x
Messaggi: 404
Iscritto il: dom 24 dic 2006, 13:40
Slackware: Slackware64-current
Kernel: 3.4.*
Desktop: KDE 4.8.2

Re: [C++] errore in compilazione

Messaggio da m0rdr3d »

Temo non sia così semplice.

Per compilare due moduli è necessario che questi siano compilati separatamente.
Quindi prima devi compilare intero.cpp con il flag -c, necessario quando si compila un sorgente che non contiene un main

Codice: Seleziona tutto

g++ -c intero.cpp
Il risultato di questa compilazione è un file intero.o, che devi utilizzare per compilare print.cpp

Codice: Seleziona tutto

g++ print.cpp intero.o
Ovviamente non è molto comodo compilare a mano ciascun modulo ogni volta, per questo si utilizza solitamente il makefile che automatizza la procedura.

L'errore che ti dà g++ è sollevato dal linker, che vede che è stata dichiarata una funzione scrivi (perchè lo vede in intero.h) ma non riesce a trovarne l'implementazione.

P.S.: la correzione di JonnyMnemonic ad intero.cpp resta comunque valida e necessaria
Ultima modifica di m0rdr3d il lun 15 dic 2008, 1:22, modificato 1 volta in totale.

Avatar utente
JohnnyMnemonic
Staff
Staff
Messaggi: 2733
Iscritto il: dom 5 set 2004, 0:00
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos
Località: Bologna
Contatta:

Re: [C++] errore in compilazione

Messaggio da JohnnyMnemonic »

Si ovviamente sarebbe buona cosa avere un makefile per queste cose, visto che gestiscono un pò tutti gli aspetti della compilazione

Era solo una soluzione quick&dirty

Avatar utente
m0rdr3d
Linux 2.x
Linux 2.x
Messaggi: 404
Iscritto il: dom 24 dic 2006, 13:40
Slackware: Slackware64-current
Kernel: 3.4.*
Desktop: KDE 4.8.2

Re: [C++] errore in compilazione

Messaggio da m0rdr3d »

JohnnyMnemonic ha scritto:Si ovviamente sarebbe buona cosa avere un makefile per queste cose, visto che gestiscono un pò tutti gli aspetti della compilazione

Era solo una soluzione quick&dirty
Scusami, ti assicuro che non voglio fare il saccente, ma utilizzando

Codice: Seleziona tutto

g++ princ.cpp intero.h
come suggerivi, il compilatore non vede comunque l'implementazione della funzione scrivi.
Per lo meno ho provato (di fretta, lo ammetto) e non ha risolto il problema.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C++] errore in compilazione

Messaggio da targzeta »

m0rdr3d ha scritto:...Per compilare due moduli è necessario che questi siano compilati separatamente.
Quindi prima devi compilare intero.cpp con il flag -c, necessario quando si compila un sorgente che non contiene un main

Codice: Seleziona tutto

g++ -c intero.h
Il risultato di questa compilazione è un file intero.o, che devi utilizzare per compilare print.cpp

Codice: Seleziona tutto

g++ print.cpp intero.o
...
Non è vero che bisogna compilarli separatamente, puoi anche darli tutti e due al g++:

Codice: Seleziona tutto

g++ intero.cpp print.cpp
Il problema nell'invocazione di JohnnyMnemonic è che ha passato un file .h al compilatore che non c'entra niente. Del resto anche il tuo comando per compilare il file intero.o credo sia un errore di digitalizzazione perchè mi sembra troppo grossolano.

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
JohnnyMnemonic
Staff
Staff
Messaggi: 2733
Iscritto il: dom 5 set 2004, 0:00
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos
Località: Bologna
Contatta:

Re: [C++] errore in compilazione

Messaggio da JohnnyMnemonic »

In effetti mi ero sbagliato a scrivere, era

Codice: Seleziona tutto

g++ princ.cpp intero.cpp
così l'ho provato e funziona

Tranquillo comunque, ammetto senza problemi che di c++ so quasi nulla, sono giusto un pochino più preparato sul C

kernel89
Linux 1.x
Linux 1.x
Messaggi: 146
Iscritto il: ven 16 feb 2007, 22:37
Slackware: 13
Desktop: kde
Località: Sassari / Pisa

[risolto] [C++] errore in compilazione

Messaggio da kernel89 »

ok ,grazie per le risposte.
Ho fatto come ha suggerito JohnnyMnemonic e funziona.

Grazie di nuovo.

ciao! :D

Avatar utente
m0rdr3d
Linux 2.x
Linux 2.x
Messaggi: 404
Iscritto il: dom 24 dic 2006, 13:40
Slackware: Slackware64-current
Kernel: 3.4.*
Desktop: KDE 4.8.2

Re: [C++] errore in compilazione

Messaggio da m0rdr3d »

spina ha scritto:Del resto anche il tuo comando per compilare il file intero.o credo sia un errore di digitalizzazione perchè mi sembra troppo grossolano.Spina
Ops, vero :roll:
Chiedo scusa, come dicevo, la fretta mi ha mal consigliato.
Scusa anche a JohnnyMnemonic per non aver capito.

P.S.: correggo lo srafalcione nel mio primo post per evitare che qualcuno in fututo trovi informazioni sbagliate.

Rispondi