erro ld estranho sobre símbolo duplicado
-
08-07-2019 - |
Pergunta
Eu tenho um projeto que consiste em dois arquivos, main.ce logoff.c. Quando eu tento compilá-los eu recebo este erro:
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
Eu tenho uma função chamada logoff no logoff.c, mas eu tenho procurado main.c para o texto "logoff" e não encontrei nada (a função não é mesmo chamado ainda!).
Se eu mudar o nome da função para log_off ele funciona. Há uma segunda função no arquivo que faz com que o mesmo erro a menos que seu nome é alterado também.
Existe alguma razão pela qual isso pode ocorrer? Eu tenho esse problema em dois sistemas diferentes. Uma coisa que pode ser relevante é que eu usei o mesmo arquivo logoff.c em outro projeto, mas não está ligado a este.
Solução
Crie um arquivo logoff.h apenas com a declaração da função de logoff, como
void logoff(void);
Então, em main.c incluí-lo com #include "logoff.h"
. Não inclua logoff.c, como o compilador irá compilar a função duas vezes, e o vinculador irá ver duas funções desse nome então.
Parece trabalho, se você alterá-lo para log_off, e, em seguida, apenas uma recompilação deles. O outro objeto-arquivo ainda terá a função de logoff de idade compilado. Assim, o vinculador vê log_off e um logoff. Essa é a razão que apareceu para trabalhar para você com esse nome.
Outras dicas
Você #include ou logoff.c #import no main.c?
Você fez - bem lá é o seu problema. logoff.c está sendo incluído no main.c, então principais define _logoff e _main. Agora você também logoff.c compilação, que define _logoff. Então você tentar ligar os dois, o que significa que o binário resultante inclui os símbolos _main, _logoff e _logoff, que é exatamente o que o ligador está falando.