Strano errore ld sul simbolo duplicato
-
08-07-2019 - |
Domanda
Ho un progetto composto da due file, main.c e logoff.c. Quando provo a compilarli ottengo questo errore:
gcc -c -g -Wall main.c
gcc -c -g -Wall logoff.c
gcc -o main -g -Wall main.o logoff.o
ld: duplicate symbol _logoff in logoff.o and main.o
Ho una funzione chiamata disconnessione in logoff.c, ma ho cercato main.c per il testo " logoff " e non ho trovato nulla (la funzione non è nemmeno stata ancora chiamata!).
Se cambio il nome della funzione in log_off, funziona. C'è una seconda funzione nel file che quindi causa lo stesso errore a meno che non venga cambiato anche il suo nome.
C'è qualche motivo per cui ciò potrebbe accadere? Ho questo problema su due diversi sistemi. Una cosa che potrebbe essere rilevante è che ho usato lo stesso file logoff.c in un altro progetto ma non è collegato a questo.
Soluzione
Crea un file logoff.h con solo la dichiarazione di funzione di disconnessione, come
void logoff (void);
Quindi, in main.c includilo con #include " logoff.h "
. Non includere logoff.c, poiché il compilatore compilerà la funzione due volte e il linker vedrà quindi due funzioni con quel nome.
Sembra funzionare se lo si cambia in log_off e quindi si ricompila solo uno di essi. L'altro file oggetto avrà ancora la vecchia funzione di disconnessione compilata. In questo modo il linker vede una disconnessione e una disconnessione. Questo è il motivo per cui sembrava funzionare per te con quel nome.
Altri suggerimenti
#include o #import logoff.c in main.c?
L'hai fatto - beh, c'è il tuo problema. logoff.c viene incluso in main.c, quindi main definisce _logoff e _main. Ora compili anche logoff.c, che definisce _logoff. Quindi prova a collegare i due, il che significa che il binario risultante include i simboli _main, _logoff e _logoff, che è esattamente ciò di cui ti parla il linker.