Pregunta

Tengo un proyecto que consta de dos archivos, main.c y logoff.c. Cuando intento compilarlos me sale este error:

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

Tengo una función llamada logoff en logoff.c, pero busqué en main.c el texto " logoff " y no he encontrado nada (¡la función ni siquiera se llama aún!).

Si cambio el nombre de la función a log_off, funciona. Hay una segunda función en el archivo que luego causa el mismo error a menos que también se cambie su nombre.

¿Hay alguna razón por la que esto pueda ocurrir? Tengo este problema en dos sistemas diferentes. Una cosa que podría ser relevante es que utilicé el mismo archivo logoff.c en otro proyecto pero no está conectado a este.

¿Fue útil?

Solución

Cree un archivo logoff.h con solo la declaración de función de cierre de sesión, como

cierre de sesión vacío (vacío);

Luego, en main.c inclúyalo con #include " logoff.h " . No incluya logoff.c, ya que el compilador compilará la función dos veces, y el enlazador verá dos funciones con ese nombre entonces.

Parece funcionar si lo cambia a log_off y luego solo vuelve a compilar uno de ellos. El otro archivo de objeto todavía tendrá la función de cierre de sesión anterior compilada. Por lo tanto, el vinculador ve un cierre de sesión y un cierre de sesión. Esa es la razón por la que parecía funcionar para ti con ese nombre.

Otros consejos

¿#incluye o #importa logoff.c en main.c?

Lo hiciste, bueno, ahí está tu problema. logoff.c se incluye en main.c, por lo que main define _logoff y _main. Ahora también compila logoff.c, que define _logoff. Luego intenta vincular los dos, lo que significa que el binario resultante incluye los símbolos _main, _logoff y _logoff, que es exactamente lo que le dice el vinculador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top