Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

626
Views
Errores de "definición múltiple", "definido por primera vez aquí"

Tengo 3 proyectos: Servidor , Cliente y Commons . Hacer pares de encabezado y fuente en Commons no causa ningún problema y puedo acceder a las funciones libremente tanto desde el Servidor como desde el Cliente .

Sin embargo, por alguna razón, crear archivos de origen/encabezado adicionales dentro del proyecto del servidor o del cliente siempre provoca errores multiple definition of (...) y first defined here .

Ejemplo:

commands.h (en el directorio raíz del proyecto del Cliente )

 #ifndef COMMANDS_H_ #define COMMANDS_H_ #include "commands.c" void f123(); #endif /* COMMANDS_H_ */

commands.c (en el directorio raíz del proyecto del Cliente )

 void f123(){ }

main.c (en el directorio raíz del proyecto del Cliente )

 #include "commands.h" int main(int argc, char** argv){ }

Errores:

 make: *** [Client] Error 1 Client first defined here Client multiple definition of `f123' commands.c

Limpiar, reconstruir índice, reconstruir proyectos no ayuda. Tampoco reiniciar la computadora.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

El problema aquí es que está incluyendo commands.c en commands.h antes del prototipo de función. Por lo tanto, el preprocesador de C inserta el contenido de commands.c en commands.h antes del prototipo de función. commands.c contiene la definición de la función. Como resultado, la definición de la función termina antes que la declaración de la función que causa el error.

El contenido de commands.h después de la fase de preprocesador se ve así:

 #ifndef COMMANDS_H_ #define COMMANDS_H_ // function definition void f123(){ } // function declaration void f123(); #endif /* COMMANDS_H_ */

Esto es un error porque no puede declarar una función después de su definición en C. Si cambió #include "commands.c" y la declaración de la función, el error no debería ocurrir porque, ahora, el prototipo de la función viene antes que la declaración de la función. .

Sin embargo, incluir un archivo .c es una mala práctica y debe evitarse. Una mejor solución para este problema sería incluir commands.h en commands.c y vincular la versión compilada de command al archivo principal. Por ejemplo:

comandos.h

 #ifndef COMMANDS_H_ #define COMMANDS_H_ void f123(); // function declaration #endif

comandos.c

 #include "commands.h" void f123(){} // function definition
over 4 years ago · Santiago Trujillo Report

0

Tuve un problema similar cuando no usaba inline para mi función global que estaba incluida en dos lugares.

over 4 years ago · Santiago Trujillo Report

0

No debe incluir commands.c en su archivo de encabezado. En general, no debe incluir archivos .c. Más bien, commands.c debería incluir commands.h. Como se define aquí, el preprocesador de C está insertando el contenido de commands.c en commands.h donde está el include. Terminas con dos definiciones de f123 en commands.h.

comandos.h

 #ifndef COMMANDS_H_ #define COMMANDS_H_ void f123(); #endif

comandos.c

 #include "commands.h" void f123() { /* code */ }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!