2011-01-23 18 views
6

Sono nelle fasi iniziali (leggi: appena iniziato ieri) di un progetto e sto impostando il mio makefile iniziale. È molto semplicistico Ecco l'intero contenuto del file:Cosa c'è di questi errori di "definizione multipla" di 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 

A questo punto penso che sia importante ricordare che sto lavorando su Windows, in modo che sto facendo tutto questo sia in PowerShell con MinGW g ++ 4.5.2 o altrimenti con Cygwin e g ++ 3.4.4 (Ho provato entrambi gli stessi errori).

Senza stampare il contenuto di tutti i file sopra elencati, è sufficiente dire che main.h contiene un riferimento a windows.h e resource.h, main.cpp contiene un riferimento a main.h e alcune funzioni , in particolare una funzione WinAPI WinMain int (...) e una funzione WndProc (...) LRESULT CALLBACK, resource.rc contiene istruzioni di definizione delle risorse per una barra dei menu semplice con un menu file e un secondo menu fittizio nonché un riferimento a resource.h, e resource.h contiene semplicemente istruzioni #define per gli ID utilizzati in resource.rc.

Ora, posso compilare resource.rc e main.h separatamente gli uni dagli altri e ottenere quei due file .o. Tuttavia, quando cerco di collegarli e produrre output.exe, ricevo il seguente elenco paura degli errori, nessuno dei quali ho davvero capito:

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 

Quanto sopra è generato in PowerShell. Cygwin fornisce una lista di errori molto simile, ancora centrata su affermazioni a "definizione multipla". Le molteplici definizioni sembrano essere originate in C: /mingw/lib/crt2.o, e possibilmente un altro file chiamato crt1.c, che sembra essere più utile poiché ovviamente C è molto più leggibile di un file .o, ma Non riesco a trovare nulla con quel titolo ovunque all'interno della cartella C: \ MinGW.

Qualsiasi direzione sarebbe utile, perché al momento sono piuttosto perso.

EDIT: L'unica istruzione #include nel main.cpp:

#include "main.h" 

Il contenuto di main.h:

#ifndef _MAIN_H_ 
    #define _MAIN_H_ 

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

#endif 
+0

Forse sarebbe utile per vedere la prima parte del file main.cpp in cui vengono inclusi intestazioni. Ricordo di avere un problema simile a questo che è stato risolto comprendendo che una delle intestazioni che includevo esplicitamente doveva essere inclusa implicitamente da un altro file di intestazione, in modo che il '# define' fosse impostato correttamente. – hardmath

+0

Non utilizzare il carattere di sottolineatura principale con '_MAIN_H_'.I nomi con trattini bassi iniziali sono riservati alle biblioteche. – KitsuneYMG

risposta

8

Stai perdendo l'argomento -c a g ++ quando stai compilando un file .cpp in un file .o. Come ora, stai cercando di creare un eseguibile da un altro.

g++ -mwindows -o main.o main.cpp dovrebbe essere g++ -mwindows -c -o main.o main.cpp

Mentre a esso, aggiungere segnali di avvertimento e, almeno -Wall

+0

Buona chiamata, ma non è stato d'aiuto. –

+1

@KenB hai "pulito" prima di provare? – ssmir

+0

Oh mia parola. Mi sento un idiota. Questo è stato. Grazie a tutti e due. –

0

hai provato a chiamare il tuo principale int main(...) invece di int WINAPI WinMain(...)? Per quanto mi ricordo MinGW aveva il suo WinMain chiama principale

[modifica]

Cioè, prova a cambiare int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) al int main(int argc, char **argv) nel main.cpp

+0

Come faccio a fare riferimento agli argomenti WinMain? Ricordati WinMain è costruita così: int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {...} –

+0

@KenB siamo questo argomenti utilizzati nel WinMain? – ssmir

+0

Sì. Questo è un semplice programma API Win32. –

Problemi correlati