Newsgroup: it.comp.lang.c
Titolo: Errore in fase di compilazione

Ciao a tutti,
leggendo un libro sulla programmazione in C in ambiente linux, un po'
vecchiotto, ho iniziato a provare gli esempi a corredo delle varie
fasi di apprendimento.
Nel caso specifico, sto provando un "programmino" con lo scopo di
evidenziare i messaggi di warning del compilatore (utilizzo gcc
versione 4.3.2-1ubuntu12) qualora si dichiari una variabile e non
venga utilizzata. Al momento della compilazione, il warning atteso
viene lanciato. Immediatamente dopo ottengo, però,  un errore per me
incomprensibile che impedisce il completamento della compilazione.
Ecco l'output generato da gcc:
gcc -D_GNU_SOURCE -Wall -g 01LST06.C -o getpid
01LST06.C: In function ‘int main(int, char**)’:
01LST06.C:14: warning: unused variable ‘PID’
/tmp/ccSZTcsV.o:(.eh_frame+0x11): undefined reference to
`__gxx_personality_v0'
collect2: ld returned 1 exit status
Che significa: "/tmp/ccSZTcsV.o:(.eh_frame+0x11): undefined reference
to `__gxx_personality_v0'
collect2: ld returned 1 exit status"
Di seguito riporto il codice del "programmino":
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
/* #define SHOW_PID */  /* MACRO NON DEFINITA */
/* L'esercizio serve per fa comparire il warning da parte del
compilatore
di variabile dichiarata ma NON UTILIZZATA. La tecnica è quella di
usare
MACRO IN FASE DI COMPILAZIONE IN QUESTO CASO SI SIMULA LA MANCANZA
DELLA MACRO
vedi l'esempio 01LST07.C che in presenza della macro farà scomparire
il warning */
	int main(int argc, char **argv){
		pid_t PID; /* Process ID */
		(void) argc; /* Cast a void per ingannare quei compilatori che
				emettono warning se i parametri delle funzioni
				non vengono suati */
		(void) argv; /* Cast a void per ingannare quei compilatori che
				emettono warning se i parametri delle funzioni
				non vengono suati */
		/* Adesso inizia il vero tutorial */
		#ifdef SHOW_PID
			PID = getpid();	/* Get Process ID */
			printf("Hello World! Process ID is %d\n", (int)PID);
		#else
			printf("Hello world!");
		#endif
			return 0;
	}
La cosa è che se commento la riga "printf("Hello world!");" funziona
tutto correttamente...
Aiutooo!!!
Grazie a tutti!
Mr. Deckard

 tutto correttamente...
Questo non me lo so spiegare... L'istruzione più "sospetta" mi pare 
l'invocazione di getpid.
Saluti


Prima di tutto grazie mille per la tua risposta,
girellando un po' su internet ho trovato che è necessario aggiungere
questo, come tu sospettavi, -lstdc++
quindi ho compilato così: gcc -D_GNU_SOURCE -Wall -g 01LST06.C -o
getpid -lstdc++
Sembrerebbe stia utilizzando qualcosa per il C++????
ma stdc++ sembrerebbe qualcosa per lo standard output???
Che cos'è stdc++? Perché mi è richiesto ciò? Non sto scrivendo un
programma in "semplice" C?
Grazie ancora!
Mr. Deckard

 Sembrerebbe stia utilizzando qualcosa per il C++????
Se il file ha estensione .C, nota la C *maiuscola*, il gcc assume che sia 
un file sorgente c++. La cosa corretta da fare nel tuo caso è eliminare "-
lstdc++" e rinominare il file in modo che abbia estensione .c, con la c 
minuscola. Non ne sono sicuro, ma immagino che se sei su di un filesystem 
non case sensitive (ad esempio se stai usando mingw su di una partizione 
windows) basti cambiare la linea di comando.
-- 
  Matteo Beniamino


Eh, eh, grazie mille,
no, no, sono sotto linux (Ubuntu)... non ricordavo più questa
cosa!!!!!
Che la "c" maiuscola indicasse C++, grazie mille...
Ma quindi -lstdc++ era il modo per fare il linking alla funzione
printf???
Grazie mille, ancora!
Mr. Deckard

 printf???
-lstdc++ linka ad una libreria addizionale necessaria ai programmi C++ 
compilati con gcc. Non credo che il problema fosse direttamente la 
printf, in quanto il linker non la segnalava tra i simboli non trovati, 
ma lascio rispondere a chi ne sa più di me sull'argomento. A tal 
proposito credo che il posto più adeguato per proseguire la discussione 
sia it.comp.os.linux.development . Imposto il follow-up.
-- 
  Matteo Beniamino