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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top