2012-06-20 23 views
23

sto porting di un'applicazione da Solaris a Linuxcrt1.o: In funzione `_start ': - undefined reference to` main' in Linux

I file oggetto che sono collegati non hanno un main() definito. Ma la compilazione e il collegamento vengono eseguiti correttamente in Solaris e viene generato l'eseguibile. In Linux ottengo questo errore

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 

Il mio problema è che non posso includere nuova .c/file .o dalla sua una grande applicazione ed è stato in esecuzione per anni. Come posso sbarazzarmi di questo errore?

extractes Codice di makefile:

RPCAPPN = api 
LINK = cc 

    $(RPCAPPN)_server: $(RPCAPIOBJ) 
      $(LINK) -g $(RPCAPIOBJ) -o $(RPCAPPN)_server $(IDALIBS) $(LIBS) $(ORALIBS) $(COMMONLIB) $(LIBAPI) $(CCLIB) $(THREADLIB) $(DBSERVERLIB) $(ENCLIB) 
+0

È possibile pubblicare il makefile e/oi comandi di compilazione effettivi? –

+0

Sì .. Ho aggiunto poche righe da makefile. – Blackforest

+0

Semplice: o smetti di chiamare main o definisci un main (^) Perché funziona su solaris? Aveva flag linker speciali (link a oggetti condivisi?) – wildplasser

risposta

23

Prova ad aggiungere -nostartfiles per le opzioni di linker, cioè

$(LINK) -nostartfiles -g ... 

Dal gcc documentation:

-nostartfiles 
    Do not use the standard system startup files when linking. The standard system libraries are used normally, unless -nostdlib or -nodefaultlibs is used. 

Questo provoca crt1.o di non essere collegato (è normalmente collegato per impostazione predefinita): normalmente utilizzato solo quando si implementa il proprio codice _start.

+3

a seconda del problema, quindi questa non è davvero una soluzione - ho avuto un problema simile quando ho provato a fare un progetto di boost test e l'aggiunta di questo flag ha reso tutto peggio – serup

13

opzione di collegamento -shared deve aggiungere quando si rispettato un modo

+2

Questo mi ha aiutato a installare un pacchetto R che in precedenza non funzionava con l'errore sopra. – Thomas

+0

concordato; questo mi ha anche aiutato a risolvere un problema con la compilazione di funzioni esterne per sqlite. – gregory

1

ho avuto risultato simile quando si cerca di costruire un nuovo progetto di test con la spinta, e si è scoperto che mi mancava una dichiarazione:

#define BOOST_TEST_MODULE <yourtestName> 
0

Per me, questo errore viene visualizzato quando si utilizzano caratteri UTF-8 non elaborati in una stringa letterale. ARM7HL, sistema Sailfish, GNU C++.