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

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

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, поэтому я делаю все это в Powershell с MinGW g ++ 4.5.2 или с Cygwin и g ++ 3.4.4 (я пробовал оба; одни и те же ошибки).

Без вывода на печать содержимого всех перечисленных выше файлов достаточно сказать, что main.h содержит ссылкуДля windows.h и resource.h main.cpp содержит ссылку на main.h и несколько функций, наиболее важные из них - функцию WINAPI WinMain (...) int и функцию WndProc (...) WALLProC (...) LRESULT CALLBACK.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

Ответы [ 2 ]

9 голосов
/ 23 января 2011

Вам не хватает аргумента -c для g ++, когда вы компилируете файл .cpp в файл .o. Сейчас вы пытаетесь создать один исполняемый файл из другого.

g++ -mwindows -o main.o main.cpp должно быть g++ -mwindows -c -o main.o main.cpp

Также добавьте флажки предупреждения, по крайней мере, -Wall

0 голосов
/ 23 января 2011

Вы пытались позвонить своему основному int main(...) вместо int WINAPI WinMain(...)? Насколько я помню, у MinGW был собственный WinMain, вызывающий main

[править]

То есть попробуйте изменить int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) на int main(int argc, char **argv) в вашем main.cpp

...