2011-12-09 16 views
31

Sto provando a programmare una classe di grafico usando un elenco adiacente da un esempio nel mio libro di testo C++ e quando compilo usando questo comando: Codice: g ++ -o prog program.cpp ... Ottengo il errore seguente:Che cosa significa l'errore in fase di compilazione "Simboli indefiniti per architettura x86_64"?

Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

... che cosa significa questo nel mondo? Potrebbe rivelarsi un problema con il mio codice, ma credo che potrebbe essere più profondo di così, perché ho ottenuto lo stesso errore apparentemente inspiegabile per diversi progetti, molti dei quali sono stati risolti in modi diversi e, sfortunatamente, completamente per errore.

Ho letto da qualche parte che potrebbe avere a che fare con l'utilizzo di librerie a 32 bit o 64 bit e che potrebbe essere necessario utilizzare i tag -m32 o -m64, ma non sono sicuro che ciò si applichi Qui. È interessante notare che, quando ho provato ad aggiungere il tag -m64 ho ottenuto lo stesso errore esatto, ma quando ho provato ad utilizzare il tag -m32 ho ottenuto lo stesso errore, tranne che ha detto

Undefined symbols for architecture i386: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

invece.

Principalmente voglio solo sapere che cosa sta dicendo l'errore nel mondo. Sono abituato a eseguire il debug degli errori in fase di compilazione che forniscono una riga specifica nel codice, ecc., Ma non riesco a distinguere nulla di simile da questo. Qualche idea?

Se è utile, sto utilizzando un Macbook di fine 2008 con Intel Core 2 Duo, (quindi a 64 bit) e sto utilizzando OS X Lion (10.7.2), che ritengo sia l'ultima versione . Inoltre, sto usando gcc versione 4.2.1.

+0

Il progetto contiene file .hpp? Vedi http://stackoverflow.com/questions/1757509/precompiled-headers-and-compiling-universal-objects-on-osxq – erturne

+4

il tuo programma ha la funzione main()? – springrider

risposta

33

Quando si compila il file, il compilatore richiama il linker che tenta di generare un eseguibile. Ma non può perché non hai fornito una funzione denominata main, che è la funzione che verrà eseguita all'avvio del programma.

O non si desidera eseguire il linker perché si desidera compilare diversi file separatamente, quindi combinarli. In tal caso, utilizzare il flag -c per indicare al compilatore di saltare la fase di collegamento.

Oppure si desidera eseguire il file compilato. Quindi è necessario implementare la funzione main.

+2

Dove useresti questo flag -c? Puoi fare un esempio? – Goldname