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
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
Non utilizzare il carattere di sottolineatura principale con '_MAIN_H_'.I nomi con trattini bassi iniziali sono riservati alle biblioteche. – KitsuneYMG