2011-01-23 13 views
6

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 
+0

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

+0

No use el guion bajo inicial con '_MAIN_H_'.Los nombres con guiones bajos principales están reservados para las bibliotecas. – KitsuneYMG

Respuesta

8

Te estás perdiendo el argumento a -c g ++ cuando está compilando un archivo .cpp en un archivo .o. Como está ahora, intentas crear un ejecutable desde otro.

g++ -mwindows -o main.o main.cpp debería ser g++ -mwindows -c -o main.o main.cpp

Mientras que en él, añadir banderas de advertencia, así, al menos -Wall

+0

Buena llamada, pero no ayudó. –

+1

@KenB ¿'has limpiado' antes de intentarlo? – ssmir

+0

Oh mi palabra. Me siento como un idiota. Eso lo hizo. Gracias a los dos. –

0

¿Usted intentó llamar a su principal lugar de int main(...)int WINAPI WinMain(...)? Por lo que yo recuerdo MinGW tenía su propio WinMain llamando principal

[editar]

Es decir, trate de cambiar a int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)int main(int argc, char **argv) en su main.cpp

+0

¿Cómo haría referencia a los argumentos de WinMain? Recuerde que WinMain está construido de la siguiente manera: int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {...} –

+0

@KenB ¿Se están usando estos argumentos en WinMain? – ssmir

+0

Sí. Este es un programa de API de Win32 simple. –

Cuestiones relacionadas