multiple definition of "_gs_map"



  • Hallo zusammen,
    Ich hab ein ziemliches Problem. Und zwar hab ich eine Datei "main.cpp", welche den Header von "GreenhillSprites.cpp" included (ich versuche zur Übung Sonic nachzubauen). Der Header von GreenhillSprites sieht so aus:

    #ifndef GREENHILLSPRITES_H_INCLUDED
    #define GREENHILLSPRITES_H_INCLUDED
    #include <SDL.h>
    #include <string>
    
    SDL_Rect gs_map[7];
    SDL_Surface* gs_sprites;
    
    void gs_loadSprites();
    void gs_spriteMap();
    SDL_Surface* gs_getSprite(int sprite);
    
    #endif // GREENHILLSPRITES_H_INCLUDED
    

    Dieser wird von GreenhillSprites.cpp sowie von main.cpp included.
    Nun kommt die Meldung:
    multiple definition of '_gs_map'
    first defined here
    In beiden Fällen wird auf Zeilen verwiesen, die überhaupt nix damit zu tun haben, die umgebenden Funktionen ebenfalls nicht.
    Wo ist da der Fehler?



  • Kommentier mal gs_map aus.. Ansonsten vereinfach das Beispiel mal soweit, wie möglich und zeig den ganzen Code.



  • Aber er sagt, "_gs_map" (also mit Unterstrich am Anfang) sei doppelt definiert.
    Zeig uns trotzdem mal den ganzen Code (oder zumindest die relevanten Teile, auch Includes), das wäre wohl am besten.



  • Also, hier sind sie:

    // main.cpp
    #include <SDL.h>
    #include "imgloader.h"
    #include "SonicSprites.h"
    #include "GreenhillSprites.h"
    #include <string>
    
    // Bildschirmeinstellungen
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 480;
    const int SCREEN_BPP = 16;
    
    // Surfaces
    SDL_Surface *screen = NULL;
    SDL_Event event;
    
    void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
    {
        //Make a temporary rectangle to hold the offsets
        SDL_Rect offset;
    
        //Give the offsets to the rectangle
        offset.x = x;
        offset.y = y;
        //Blit the surface
        SDL_BlitSurface( source, NULL, destination, &offset );
    }
    
    int main( int argc, char* args[] )
    {
        //Initialize all SDL subsystems
        if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
        {
            return 1;
        }
    
        //Set the window caption
        bool quit = false;
        SDL_WM_SetCaption( "Event test", NULL );
    
        //Set up the screen
        screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
        //If there was an error in setting up the screen
        if( screen == NULL )
        {
            return 1;
        }
        //Set the window caption
        SDL_WM_SetCaption( "Hello World", NULL );
    
        // Sprites laden & einfügen
        ss_loadSprites();
        apply_surface(20, 20, ss_getSprite(1), screen);
    
        //Update the screen
        if( SDL_Flip( screen ) == -1 )
        {
            return 1;
        }
    
        // Game Loop
        while(quit == false) {
            while(SDL_PollEvent(&event)) {
                if(event.type == SDL_QUIT) {
                    //Programm beenden
                    quit = true;
                }
            }
        }
    
        //Free the surfaces
        SDL_FreeSurface( message );
        SDL_FreeSurface( background );
    
        //Quit SDL
        SDL_Quit();
    
        //Return
        return 0;
    }
    
    //GreenhillSprites.h
    #ifndef GREENHILLSPRITES_H_INCLUDED
    #define GREENHILLSPRITES_H_INCLUDED
    #include <SDL.h>
    #include <string>
    
    SDL_Rect gs_map[7];
    SDL_Surface* gs_sprites;
    
    void gs_loadSprites();
    void gs_spriteMap();
    SDL_Surface* gs_getSprite(int sprite);
    
    #endif // GREENHILLSPRITES_H_INCLUDED
    
    //GreenhillSprites.cpp
    #include "GreenhillSprites.h"
    
    void gs_loadSprites() {
        // Surfaces definieren
        gs_sprites = NULL;
        // evtl *gs_sprites = NULL???
    
        // Sprites Laden
        SDL_Surface* loader = NULL;
        loader = SDL_LoadBMP("greenhillsprites.bmp");
        gs_sprites = SDL_DisplayFormat(loader);
        SDL_FreeSurface(loader);
        //Colorkey setzen
        Uint32 colorkey = SDL_MapRGB( gs_sprites->format, 0xFF, 0xFF, 0xFF );
        SDL_SetColorKey( gs_sprites, SDL_SRCCOLORKEY, colorkey );
    }
    
    SDL_Surface* gs_getSprite(int sprite) {
        SDL_Rect offset;
        offset.x = 0;
        offset.y = 0;
    
        SDL_Surface* destination;
        SDL_BlitSurface(gs_sprites, &gs_map[sprite], destination, &offset);
        return destination;
    
    }
    
    void gs_spriteMap() {
    
        gs_map[0].x = 1;
        gs_map[0].y = 1;
        gs_map[0].w = 255;
        gs_map[0].h = 255;
    
        gs_map[1].x = 258;
        gs_map[1].y = 1;
        gs_map[1].w = 255;
        gs_map[1].h = 255;
    
        gs_map[2].x = 515;
        gs_map[2].y = 1;
        gs_map[2].w = 255;
        gs_map[2].h = 255;
    
        gs_map[3].x = 1;
        gs_map[3].y = 3318;
        gs_map[3].w = 255;
        gs_map[3].h = 255;
    
        gs_map[4].x = 258;
        gs_map[4].y = 3318;
        gs_map[4].w = 255;
        gs_map[4].h = 255;
    
        gs_map[5].x = 515;
        gs_map[5].y = 3318;
        gs_map[5].w = 255;
        gs_map[5].h = 255;
    
        gs_map[6].x = 515;
        gs_map[6].y = 3543;
        gs_map[6].w = 255;
        gs_map[6].h = 255;
    }
    

    SonicSprites.h und SonicSprites.cpp sind identinsch mit Ausnahme der Methoden- und Variablennamen.



  • Du hast also diesen Teil 2 mal? (In 2 Headern):

    SDL_Rect gs_map[7];
    

    Nach dieser Aussagen zu Folge:

    SonicSprites.h und SonicSprites.cpp sind identinsch mit Ausnahme der Methoden- und Variablennamen.



  • Nein, die Variablennamen sind ja anders. Bei SonicSprites und der Headerdatei ist anstatt dem Kürzel gs überall das Kürzel ss vorne dran.



  • Dann tu mal alles nichtrelevante rauskommentieren bis es geht.



  • Bringt nix...



  • zilti schrieb:

    Bringt nix...

    Gibts nicht. Spätestens, wenn dein Projekt leer ist, sollte es gehen.



  • Ja, aber dann ist ja auch das Relevante raus.



  • Man definiert keine Variablen in Headerdateien.
    Verschieb die Definition in eine Quellcodedatei, und schreib eine Deklaration in den Header (extern).



  • Wie geht denn ne Deklaration in der Headerdatei? (Bin ausm Java-Lager)



  • extern SDL_Rect gs_map[7];


Log in to reply