Я нахожусь на ранних стадиях (читай: только что начат вчера) проекта, и я настраиваю свой начальный 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