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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top