Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 31
  1. #1

    [c++] errore "multiple definition of..."

    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???

  2. #2
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    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)
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  3. #3
    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

  4. #4
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    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.

    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.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    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)

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Sicuramente non gli stessi errori.

    Mostra i due file e gli errori di compilazione ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    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???

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.