PDA

Visualizza la versione completa : [c++] errore "multiple definition of..."


W@tcht0wer
03-10-2009, 16:46
salve a tutti.
per fare pratica con le librerie allegro sto sviluppando utilizzando dev-c++un "motore" per un gioco RPG vecchio stile (come i vari final fantasy per gba/ds per intenderci).
tutto funzionava alla grande e il progetto andava bene ma da quando ho aggiunto un secondo file .cpp al progetto non riesco più a compilarlo....

questo è il log della compilazione che mi restituisce dev-c++:

Compilatore: Default compiler
Building Makefile: "C:\Users\Administrator\Documents\Prg_Allegro\RPG Source\Makefile.win"
Esecuzione di make...
make.exe -f "C:\Users\Administrator\Documents\Prg_Allegro\RPG Source\Makefile.win" all
g++.exe -c battle.cpp -o battle.o -I"C:/Programmi/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Programmi/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Programmi/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Programmi/Dev-Cpp/include/c++/3.4.2" -I"C:/Programmi/Dev-Cpp/include"

g++.exe battle.o main.o -o "RPG Source.exe" -L"C:/Programmi/Dev-Cpp/lib" -mwindows ../../../../../Programmi/Dev-Cpp/lib/liballeg.a

main.o(.text+0x176):main.cpp: multiple definition of `playerbat(BITMAP*)'
battle.o(.text+0x342):battle.cpp: first defined here
main.o(.text+0x206):main.cpp: multiple definition of `nemicobat(BITMAP*, RGB*)'
battle.o(.text+0x370):battle.cpp: first defined here
main.o(.text+0x24c):main.cpp: multiple definition of `sceltamenubatt()'
battle.o(.text+0x100):battle.cpp: first defined here
main.o(.text+0x2b8):main.cpp: multiple definition of `menubattaglia(BITMAP*, BITMAP*, RGB*, FONT*)'
battle.o(.text+0x16c):battle.cpp: first defined here
main.o(.text+0x3c8):main.cpp: multiple definition of `sfondobattaglia(BITMAP*, RGB*)'
battle.o(.text+0x2de):battle.cpp: first defined here
main.o(.text+0x42c):main.cpp: multiple definition of `battaglia(BITMAP*, BITMAP*, RGB*, FONT*)'
battle.o(.text+0x3b6):battle.cpp: first defined here
main.o(.bss+0x424):main.cpp: multiple definition of `sfondobat'
battle.o(.bss+0x0):battle.cpp: first defined here
main.o(.bss+0x428):main.cpp: multiple definition of `giocatore1'
battle.o(.bss+0x4):battle.cpp: first defined here
main.o(.bss+0x42c):main.cpp: multiple definition of `nemico'
battle.o(.bss+0x8):battle.cpp: first defined here
main.o(.bss+0x430):main.cpp: multiple definition of `menubatt'
battle.o(.bss+0xc):battle.cpp: first defined here
main.o(.bss+0x434):main.cpp: multiple definition of `xplayer1'
battle.o(.bss+0x10):battle.cpp: first defined here
main.o(.bss+0x438):main.cpp: multiple definition of `yplayer1'
battle.o(.bss+0x14):battle.cpp: first defined here
main.o(.bss+0x43c):main.cpp: multiple definition of `xnemico'

battle.o(.bss+0x18):battle.cpp: first defined here
main.o(.bss+0x440):main.cpp: multiple definition of `ynemico'
battle.o(.bss+0x1c):battle.cpp: first defined here
main.o(.bss+0x444):main.cpp: multiple definition of `xcomando1'
battle.o(.bss+0x20):battle.cpp: first defined here
main.o(.bss+0x448):main.cpp: multiple definition of `ycomando1'
battle.o(.bss+0x24):battle.cpp: first defined here
main.o(.bss+0x44c):main.cpp: multiple definition of `yevidenziatore'
battle.o(.bss+0x28):battle.cpp: first defined here
main.o(.bss+0x450):main.cpp: multiple definition of `comando1'
battle.o(.bss+0x2c):battle.cpp: first defined here
main.o(.bss+0x464):main.cpp: multiple definition of `sceltacom'

battle.o(.bss+0x40):battle.cpp: first defined here
main.o(.bss+0x468):main.cpp: multiple definition of `scelta'
battle.o(.bss+0x44):battle.cpp: first defined here
main.o(.bss+0x46c):main.cpp: multiple definition of `varturno'
battle.o(.bss+0x48):battle.cpp: first defined here
main.o(.bss+0x470):main.cpp: multiple definition of `giocatore_1'
battle.o(.bss+0x4c):battle.cpp: first defined here
main.o(.bss+0x488):main.cpp: multiple definition of `nemico_1'
battle.o(.bss+0x64):battle.cpp: first defined here
collect2: ld returned 1 exit status

make.exe: *** ["RPG] Error 1

Esecuzione terminata


il progetto e composto da questi file:

main.cpp --> main.h
battle.cpp --> battle.h - battlegiocatore.h - battlenemici.h

ho notato che gli errori riguardano solo le variabili e le funzioni del secondo file .cpp, ma ho controllato e ricontrollato e errori non ne ho trovati!! anche perchè prima che trasformassi il file battle.h in un file cpp con il suo file header h tutto andava a meraviglia!!

avete qualche idea???

KrOW
03-10-2009, 18:45
Ciao . . . Non è facile risponderti senza un po di codice, comunque quel messaggio si ha soprattutto quando:
1)viene definito/a piú volte una funzione o un oggetto già definito/a nello stesso scope
2)viene definito/a una funzione non inline o un oggetto in un header condiviso tra più moduli
3)mancanza di prevenzione dall' inclusione multipla degli headers (ovvero mancanza degli "include guards" o direttive simili)

W@tcht0wer
03-10-2009, 19:03
allora penso che postare tutto il codice sia troppo "dispersivo"

posto il file battle.h che è il file dalla quale provengono la maggior parte degli errori


#ifndef H_BATTLE
#define H_BATTLE

/* posizione finestra battaglia */
#define xfinestrabatt 10
#define yfinestrabatt 764

/* Risoluzione */
#define H_ris 1280
#define L_ris 1024
/* ATTENZIONE!!! modificare anche in main.h!!! */

/* Dichiarazioni variabili */
BITMAP *sfondobat, *giocatore1, *nemico, *menubatt;
int xplayer1, yplayer1, xnemico, ynemico, xcomando1, ycomando1, yevidenziatore, ;
char comando1[20];

/* Variabili sistema */
int sceltacom, scelta, varturno;

void sceltamenubatt() {
if(scelta==0) { /* scelta azione del turno */
if(sceltacom<5) { if(key[KEY_DOWN]) { sceltacom++; yevidenziatore = yevidenziatore + 40; } }
if(sceltacom>1) { if(key[KEY_UP]) { sceltacom--; yevidenziatore = yevidenziatore - 40; } }
if(key[KEY_SPACE]) { scelta = sceltacom; }
}
if(scelta!=0) {

}
}

void menubattaglia(BITMAP *evidenziatore, BITMAP *buf, PALETTE colori, FONT *font1) {
menubatt = load_bmp("finestra battaglia.bmp", colori); // disegna finestra battaglia
draw_sprite(buf, menubatt, xfinestrabatt, yfinestrabatt); //
textout_ex(buf, font1, comando1, xcomando1, ycomando1, -1, -1); // Comandi battaglia

if(varturno<=1){ /* eseguito solo una volta ad inizio turno */
scelta = 0;
sprintf(comando1, "attacca"); xcomando1 = 55; ycomando1 = 784; // mostra scelta azioni durante la battaglia
sceltacom = 1; yevidenziatore = ycomando1 + 7;
varturno++;
}
draw_sprite(buf, evidenziatore, (xcomando1 - 35), yevidenziatore); /* visualizza evidenziatore scelta */

while(scelta==0) {
sceltamenubatt();
}
}

void sfondobattaglia(BITMAP *buf, PALETTE colori) {
sfondobat = load_bmp("sfondo1.bmp", colori);
blit(sfondobat, buf, 0, 0, 0, 0, H_ris, L_ris);
}

#endif


questo file viene incluso nel file battle.cpp tramite un normalissimo #include

MItaly
03-10-2009, 19:07
In ogni file .cpp di fatto vai a ridefinire le funzioni scritte nel .h, dal momento che quel file viene incluso in ogni .cpp. Se ci sono delle funzioni da condividere tra diversi file .cpp queste non vanno scritte in un header; nell'header ci andrà solo il prototipo, mentre la definizione vera e propria andrà in un file .cpp separato. Stesso discorso per le variabili globali: dichiarate come extern nel .h, definite effettivamente in un singolo .cpp.

W@tcht0wer
03-10-2009, 19:17
il file battle.h viene incluso nel file battle.cpp e da nient altro... battle.cpp è incluso in main.cpp.

avevo già provato ad usare un file cpp invece di un h ma non cambia nulla. :confused:

non capisco perchè gli errori si limitino alle definizioni del file battle.cpp. nel file main.h ad esempio c'è una funzione di doppiobuffering che viene utilizzata da ogni file del progetto ma quella non da errore.

oregon
03-10-2009, 19:25
Forse MItaly non e' stato abbastanza chiaro ...

NON si inseriscono le variabili ne', tanto meno, il codice nei file include ...

Devi usare un file .cpp per variabili/codice e un .h per le dichiarazioni ...

Se hai gia' provato, facci vedere come hai suddiviso i vari elementi e gli eventuali errori che hai dopo la suddivisione corretta.

W@tcht0wer
03-10-2009, 19:40
ma ad esempio se inserisco tutto il contenuto del file postato sopra nel file battle.cpp ottengo ancora gli stessi errori anche se il codice non risiede più nel file header ma nel cpp ( e per cui nel file header non c'è più nulla, l'ho addirittura dis-incluso dal progetto)

oregon
03-10-2009, 20:17
Sicuramente non gli stessi errori.

Mostra i due file e gli errori di compilazione ...

W@tcht0wer
03-10-2009, 20:29
allora se copio il contenuto del file battle.h nel file battle.cpp...

#include <allegro.h>
#include <iostream>

/* Dichiarazioni variabili */
BITMAP *sfondobat, *giocatore1, *nemico, *menubatt;
int xplayer1, yplayer1, xnemico, ynemico, xcomando1, ycomando1, yevidenziatore, ;
char comando1[20];

/* Variabili sistema */
int sceltacom, scelta, varturno;


/* posizione finestra battaglia */
#define xfinestrabatt 10
#define yfinestrabatt 764

/* Risoluzione */
#define H_ris 1280
#define L_ris 1024
/* ATTENZIONE!!! modificare anche in main.h!!! */

void playerbat(BITMAP *buf) {
draw_sprite(buf, giocatore1, xplayer1, yplayer1);
}

void nemicobat(BITMAP *buf, PALETTE colori) {
nemico = load_bmp("nemico.bmp", colori);
draw_sprite(buf, nemico, xnemico, ynemico);
}

void sceltamenubatt() {
if(scelta==0) { /* scelta azione del turno */
if(sceltacom<5) { if(key[KEY_DOWN]) { sceltacom++; yevidenziatore = yevidenziatore + 40; } }
if(sceltacom>1) { if(key[KEY_UP]) { sceltacom--; yevidenziatore = yevidenziatore - 40; } }
if(key[KEY_SPACE]) { scelta = sceltacom; }
}
if(scelta!=0) {

}
}

void menubattaglia(BITMAP *evidenziatore, BITMAP *buf, PALETTE colori, FONT *font1) {
menubatt = load_bmp("finestra battaglia.bmp", colori); // disegna finestra battaglia
draw_sprite(buf, menubatt, xfinestrabatt, yfinestrabatt); //
textout_ex(buf, font1, comando1, xcomando1, ycomando1, -1, -1); // Comandi battaglia

if(varturno<=1){ /* eseguito solo una volta ad inizio turno */
scelta = 0;
sprintf(comando1, "attacca"); xcomando1 = 55; ycomando1 = 784; // mostra scelta azioni durante la battaglia
sceltacom = 1; yevidenziatore = ycomando1 + 7;
varturno++;
}
draw_sprite(buf, evidenziatore, (xcomando1 - 35), yevidenziatore); /* visualizza evidenziatore scelta */

while(scelta==0) {
sceltamenubatt();
}
}

void sfondobattaglia(BITMAP *buf, PALETTE colori) {
sfondobat = load_bmp("sfondo1.bmp", colori);
blit(sfondobat, buf, 0, 0, 0, 0, H_ris, L_ris);
}


void battaglia(BITMAP *evidenziatore, BITMAP *buf, PALETTE colori, FONT *font1) {
sfondobattaglia(buf, colori);

giocatore1 = load_bmp("player1.bmp", colori);
xplayer1 = 900; yplayer1 = 432; /* coordinate giocatore in battaglia */
playerbat(buf);

xnemico = 300; ynemico = 462; /* coordinate nemico in battaglia */
nemicobat(buf, colori);

menubattaglia(evidenziatore, buf, colori, font1);

destroy_bitmap(sfondobat);
destroy_bitmap(giocatore1);
destroy_bitmap(nemico);
destroy_bitmap(menubatt);
}


ottengo questo log di compilazione


Compilatore: Default compiler
Building Makefile: "C:\Users\Administrator\Documents\Prg_Allegro\RPG Source\Makefile.win"
Esecuzione di make...
make.exe -f "C:\Users\Administrator\Documents\Prg_Allegro\RPG Source\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Programmi/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Programmi/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Programmi/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Programmi/Dev-Cpp/include/c++/3.4.2" -I"C:/Programmi/Dev-Cpp/include"

g++.exe battle.o main.o -o "RPG Source.exe" -L"C:/Programmi/Dev-Cpp/lib" -mwindows ../../../../../Programmi/Dev-Cpp/lib/liballeg.a

main.o(.text+0x176):main.cpp: multiple definition of `playerbat(BITMAP*)'
battle.o(.text+0x100):battle.cpp: first defined here
main.o(.text+0x206):main.cpp: multiple definition of `nemicobat(BITMAP*, RGB*)'
battle.o(.text+0x190):battle.cpp: first defined here
main.o(.text+0x24c):main.cpp: multiple definition of `sceltamenubatt()'
battle.o(.text+0x1d6):battle.cpp: first defined here
main.o(.text+0x2b8):main.cpp: multiple definition of `menubattaglia(BITMAP*, BITMAP*, RGB*, FONT*)'
battle.o(.text+0x242):battle.cpp: first defined here
main.o(.text+0x3c8):main.cpp: multiple definition of `sfondobattaglia(BITMAP*, RGB*)'
battle.o(.text+0x352):battle.cpp: first defined here
main.o(.text+0x42c):main.cpp: multiple definition of `battaglia(BITMAP*, BITMAP*, RGB*, FONT*)'
battle.o(.text+0x3b6):battle.cpp: first defined here
main.o(.bss+0x424):main.cpp: multiple definition of `sfondobat'
battle.o(.bss+0x0):battle.cpp: first defined here
main.o(.bss+0x428):main.cpp: multiple definition of `giocatore1'
battle.o(.bss+0x4):battle.cpp: first defined here
main.o(.bss+0x42c):main.cpp: multiple definition of `nemico'
battle.o(.bss+0x8):battle.cpp: first defined here
main.o(.bss+0x430):main.cpp: multiple definition of `menubatt'
battle.o(.bss+0xc):battle.cpp: first defined here
main.o(.bss+0x434):main.cpp: multiple definition of `xplayer1'
battle.o(.bss+0x10):battle.cpp: first defined here
main.o(.bss+0x438):main.cpp: multiple definition of `yplayer1'
battle.o(.bss+0x14):battle.cpp: first defined here
main.o(.bss+0x43c):main.cpp: multiple definition of `xnemico'
battle.o(.bss+0x18):battle.cpp: first defined here
main.o(.bss+0x440):main.cpp: multiple definition of `ynemico'
battle.o(.bss+0x1c):battle.cpp: first defined here
main.o(.bss+0x444):main.cpp: multiple definition of `xcomando1'
battle.o(.bss+0x20):battle.cpp: first defined here
main.o(.bss+0x448):main.cpp: multiple definition of `ycomando1'
battle.o(.bss+0x24):battle.cpp: first defined here
main.o(.bss+0x44c):main.cpp: multiple definition of `yevidenziatore'
battle.o(.bss+0x28):battle.cpp: first defined here
main.o(.bss+0x450):main.cpp: multiple definition of `comando1'
battle.o(.bss+0x2c):battle.cpp: first defined here
main.o(.bss+0x464):main.cpp: multiple definition of `sceltacom'
battle.o(.bss+0x40):battle.cpp: first defined here
main.o(.bss+0x468):main.cpp: multiple definition of `scelta'
battle.o(.bss+0x44):battle.cpp: first defined here
main.o(.bss+0x46c):main.cpp: multiple definition of `varturno'
battle.o(.bss+0x48):battle.cpp: first defined here
main.o(.bss+0x470):main.cpp: multiple definition of `giocatore_1'
battle.o(.bss+0x4c):battle.cpp: first defined here
main.o(.bss+0x488):main.cpp: multiple definition of `nemico_1'
battle.o(.bss+0x64):battle.cpp: first defined here
collect2: ld returned 1 exit status

make.exe: *** ["RPG] Error 1

Esecuzione terminata


che a me sembra esatamente identico al precedente

può essere che devc++ stia sclerando???

oregon
03-10-2009, 20:31
Originariamente inviato da W@tcht0wer
allora se copio il contenuto del file battle.h nel file battle.cpp...


Ma il contenuto di battle.h rimane e nel main c'e' l'include ... quindi ...

Loading