Что с этими ошибками "множественного определения" g ++?

Я нахожусь на ранних стадиях (читай: только что начат вчера) проекта, и я настраиваю свой начальный makefile. Это очень упрощенно. Вот полное содержание файла:

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 

На этом этапе я думаю, что важно упомянуть, что я работаю над Windows, поэтому я m делает все это либо в Powershell с MinGW g ++ 4.5.2, либо с Cygwin и g ++ 3.4.4 (я пробовал оба; те же ошибки).

Не печатая содержимое всех перечисленных выше файлов, он достаточно сказать, что main.h содержит ссылку на windows.h и resource.h, main.cpp содержит ссылку на main.h и несколько функций, наиболее важно функцию int WINAPI WinMain (...) и LRESULT CALLBACK Функция WndProc (...), resource.rc содержит операторы определения ресурсов для простой строки меню с меню файла и фиктивным вторым меню, а также ссылку на resource.h, а resource.h просто содержит операторы #define для идентификаторов используется в resource.rc.

Теперь я могу скомпилировать и resource.rc, и main.h отдельно друг от друга и получить эти два хороших файла .o. Однако, когда я пытаюсь связать их и создать output.exe, Я получаю следующий пугающий список ошибок, ни одну из которых я не понимаю:

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

Вышеупомянутое сгенерировано в Powershell. Cygwin дает очень похожий список ошибок, по-прежнему сосредоточенный вокруг операторов "множественного определения". Множественные определения, похоже, происходят из C: /mingw/lib/crt2.o и, возможно, из другого файла с именем crt1.c, который казался бы более полезным, поскольку, очевидно, C гораздо более удобочитаем, чем файл .o, но Я не могу найти ничего с таким заголовком в папке C: \ MinGW.

Любое направление было бы полезным, потому что на данный момент я довольно потерян.

РЕДАКТИРОВАТЬ: Единственный оператор #include в main.cpp:

#include "main.h"

Содержимое main.h:

#ifndef _MAIN_H_
    #define _MAIN_H_

    #include <windows.h>
    #include "resource.h"

#endif
6
задан Ken Bellows 23 January 2011 в 20:35
поделиться