2011-11-01 5 views
25

Sto cercando di compilare un programma (chiamato ES3), ma, quando scrivo da terminale:undefined reference to principale - collect2: ld returned 1 exit status di

gcc es3.c -o es3

appare questo messaggio:

/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: ld returned 1 exit status 

Cosa posso fare?

+0

Potrebbe essere una buona idea pubblicare il codice che causa questo errore. – Lundin

+1

@BrandoSK: Quando seguo quel collegamento, ottengo un conto alla rovescia di 45 secondi. Inserisci il codice come parte della tua domanda o restringilo su un piccolo esempio che illustra il problema e pubblicalo. –

+0

Ok, ho appena scaricato il file sorgente. (1) Si chiama 'es3_f3.c', non' es3.c'. (2) Contiene più errori, ad esempio un punto e virgola mancante nella riga 18. Non è possibile che sia stato compilato, il che significa che non è possibile ottenere abbastanza lontano da visualizzare l'errore del linker segnalato. Mostraci il tuo vero codice. (Il file sorgente scaricato è 73 righe, che è abbastanza breve da postare direttamente qui.) –

risposta

38

Significa chenon definisce una funzione main e si sta tentando di creare un file eseguibile. Un eseguibile deve avere un punto di ingresso, quindi il linker si lamenta.

Per compilare solo per un file oggetto, utilizzare l'opzione -c:

gcc es3.c -c 
gcc es3.o main.c -o es3 

È possibile che compila es3.c ad un file oggetto, quindi compila un file main.c che dovrebbe contenere la funzione main, e il linker si fonde es3.o e main.o in un eseguibile chiamato es3.

+2

il problema è che ho inserito la funzione principale all'interno del mio programma .. Non capisco perché dice che non c'è nessuna funzione principale ...:/ – bransharp

2

Il file eseguibile richiede una funzione principale. Vedi sotto ciao demo mondiale.

#include <stdio.h> 
int main(void) 
{ 
     printf("Hello world!\n"); 
     return 0; 
} 

Come potete vedere c'è una funzione principale. se non si dispone di questa funzione principale, ld riporterà "undefined reference to main'"

controllare il mio risultato:

$ cat es3.c 
#include <stdio.h> 
int main(void) 
{ 
    printf("Hello world!\n"); 
    return 0; 
} 
$ gcc -Wall -g -c es3.c 
$ gcc -Wall -g es3.o -o es3 
~$ ./es3 
Hello world! 

si prega di utilizzare $ objdump -t es3.o per verificare se c'è un simbolo principale. Di seguito è il mio risultato.

$ objdump -t es3.o 

es3.o:  file format elf32-i386 

SYMBOL TABLE: 
00000000 l df *ABS* 00000000 es3.c 
00000000 l d .text 00000000 .text 
00000000 l d .data 00000000 .data 
00000000 l d .bss 00000000 .bss 
00000000 l d .debug_abbrev 00000000 .debug_abbrev 
00000000 l d .debug_info 00000000 .debug_info 
00000000 l d .debug_line 00000000 .debug_line 
00000000 l d .rodata  00000000 .rodata 
00000000 l d .debug_frame 00000000 .debug_frame 
00000000 l d .debug_loc  00000000 .debug_loc 
00000000 l d .debug_pubnames  00000000 .debug_pubnames 
00000000 l d .debug_aranges 00000000 .debug_aranges 
00000000 l d .debug_str  00000000 .debug_str 
00000000 l d .note.GNU-stack  00000000 .note.GNU-stack 
00000000 l d .comment  00000000 .comment 
00000000 g  F .text 0000002b main 
00000000   *UND* 00000000 puts 
+0

grazie per le vostre risposte, ma ho la funzione principale all'interno del mio programma :( non capisco perché il compilatore non lo legge :( – bransharp

+0

ho verificato sul mio linux, – Daniel

+1

Credo che tu non abbia un main, è oscurato, saltato dal preprocessore, reso interno o statico ... Prova a "indentare" il tuo file, sarà più leggibile per te ... –

10

Forse la funzione main è stata commentata a causa di esempio pre-elaborazione. Per sapere cosa sta facendo la pre-elaborazione, prova gcc -C -E es3.c > es3.i quindi cerca con un editor il file generato es3.i (e cerca all'interno di esso il numero main).

In primo luogo, si dovrebbe sempre (da quando sei un principiante) compila con

gcc -Wall -g -c es3.c 
    gcc -Wall -g es3.o -o es3 

La bandiera -Wall è estremamente importante, e si dovrebbe sempre usare. Indica al compilatore di darti (quasi) tutti gli avvertimenti. E dovresti sempre ascoltare gli avvertimenti, ad esempio correggere il file del codice sorgente es3.C finché non ricevi altri avvisi.

Il flag -g è importante anche perché richiede gcc per inserire le informazioni di debug nel file oggetto e nell'eseguibile. Quindi è possibile utilizzare un debugger (come gdb) per eseguire il debug del programma.

Per ottenere l'elenco di simboli in un file oggetto o un file eseguibile, è possibile utilizzare nm.

Naturalmente, presumo che tu usi un sistema GNU/Linux (e ti invito a usare GNU/Linux se non lo usi già).

+0

sì sto usando Ubuntu! Vado a provare quello che stai dicendo grazie ..! – bransharp

0

Una possibilità che non è stata menzionata finora è che potresti non modificare il file che pensi di essere. il tuo editore potrebbe avere un cwd diverso da quello che avevi in ​​mente.

Esegui "altro" sul file che stai compilando per ricontrollare che abbia effettivamente i contenuti che speri che faccia. Spero possa aiutare!

0

È possibile aggiungere una funzione main per risolvere questo problema. Proprio come:

int main() 
{ 
    return 0; 
} 
Problemi correlati