Estoy en las primeras etapas (léase: recién comencé ayer) de un proyecto, y estoy configurando mi archivo MAKE inicial. Es muy simplista. Aquí está el contenido completo del archivo:¿Qué pasa con estos errores de "definición múltiple" de g ++?
all: main.o resource.o
g++ -o output.exe main.o resource.o
main.o: main.cpp main.h resource.h
g++ -mwindows -o main.o main.cpp
resource.o: resource.rc
windres resource.rc resource.o
clean:
rm *.o
En este punto creo que es importante mencionar que estoy trabajando en Windows, por lo que estoy haciendo todo esto, ya sea en PowerShell con MinGW g ++ 4.5.2 o más con Cygwin y g ++ 3.4.4 (he intentado ambos, mismos errores).
Sin imprimir el contenido de todos los archivos mencionados anteriormente, basta con decir que main.h contiene una referencia a windows.h y resource.h, main.cpp contiene una referencia a main.h y algunas funciones , lo que es más importante, una función WINAPI WinMain (...) y una función LRESULT CALLBACK WndProc (...), resource.rc contiene sentencias de definición de recursos para una simple barra de menú con un menú de archivo y un segundo menú ficticio, así como una referencia a resource.h, y resource.h simplemente contiene sentencias #define para los ID utilizados en resource.rc.
Ahora, puedo compilar tanto resource.rc como main.h por separado y obtener esos dos buenos archivos .o. Sin embargo, cuando intento de vincularlos y producir output.exe, me sale el siguiente listado de miedo de errores, ninguno de los cuales realmente entiendo:
main.o:main.cpp:(.text+0x0): multiple definition of `mainCRTStartup'
c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../crt2.o:crt1.c:(.text+0x160): first defined here
main.o:main.cpp:(.text+0x0): multiple definition of `WinMainCRTStartup'
c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../crt2.o:crt1.c:(.text+0x140): first defined here
collect2: ld returned 1 exit status
make: *** [all] Error 1
El anterior se genera en Powershell. Cygwin proporciona una lista muy similar de errores, que todavía se centra en las declaraciones de "definición múltiple". Las definiciones múltiples parecen originarse en C: /mingw/lib/crt2.o, y posiblemente en otro archivo llamado crt1.c, que parece ser más útil ya que obviamente C es mucho más legible que un archivo .o, pero No puedo encontrar nada con ese título en ninguna parte dentro de la carpeta C: \ MinGW.
Cualquier dirección en absoluto sería útil, porque en este momento estoy bastante perdido.
EDIT: La única instrucción # include en main.cpp:
#include "main.h"
El contenido de main.h:
#ifndef _MAIN_H_
#define _MAIN_H_
#include <windows.h>
#include "resource.h"
#endif
Quizás ayudaría a ver la primera parte del archivo main.cpp donde se incluyen las cabeceras. Recuerdo que tuve un problema similar al que se resolvió al comprender que uno de los encabezados que incluí explícitamente debía incluirse implícitamente en otro archivo de encabezado, de modo que el '# define' se configuró correctamente. – hardmath
No use el guion bajo inicial con '_MAIN_H_'.Los nombres con guiones bajos principales están reservados para las bibliotecas. – KitsuneYMG