Komischer Fehler



  • Ich habe versucht einen Bilderloader für SDL zu programmieren, aber es kommen immer seltsame Fehler in VC 2010:

    #include <stdio.h>
    #include <string>
    #include "SDL.h"
    #include "SDL_image.h"
    
    SDL_Surface* load_img(std::string filename)
    {	
    	SDL_Surface *loadimg = NULL;
    	SDL_Surface *newimg = NULL;
    
    	loadimg = IMG_Load(filename.c_str() );
    
    	if(loadimg != NULL)
    	{
    		fprintf(stdout,"Bildv0.5 geladen: ", filename);
    		newimg = SDL_DisplayFormat(loadimg);
    		SDL_FreeSurface(loadimg);
    		if(newimg != NULL)
    		{
    			fprintf(stdout,"Bildv.1 geladen: ",filename);
    		}
    		else
    		{
    			fprintf(stderr, "Bildv.1 geladen: ", filename);
    			return 0;
    		}
    	}
    	else
    	{
    		fprintf(stderr, "Bildv0.5 nicht geladen: ", filename);
    		return 0;
    	}
    	return newimg;
    }
    

    Die Fehler:

    Fehler 1 error LNK2005: "struct SDL_Surface * __cdecl load_img(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?load_img@@YAPAUSDL_Surface@@V?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?$allocator@D@2@@std@@@Z) ist bereits in lol.obj definiert. C:\Users\Templar\documents\visual studio 2010\Projects\sdl_game\sdl_game\main.obj

    Fehler 2 error LNK2005: "struct SDL_Surface * __cdecl load_img(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?load_img@@$$FYAPAUSDL_Surface@@V?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?$allocator@D@2@@std@@@Z) ist bereits in lol.obj definiert. C:\Users\Templar\documents\visual studio 2010\Projects\sdl_game\sdl_game\main.obj

    Fehler 4 error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden. C:\Users\Templar\documents\visual studio 2010\Projects\sdl_game\Debug\sdl_game.exe 1

    Danke schon mal für euere Hilfe, ich komme hier einfach nicht weiter 😞





  • In welcher Datei steht der Codeschnipsel, den du gepostet hast? Wie sieht der Header dazu aus?



  • Die Datei heißt "lol.cpp" da ich schonmal die datei geändert hatte und der header "func.h":

    #include "SDL.h"
    #include <string>
    
    SDL_Surface* load_img(std::string filename);
    


  • Und wird lol.cpp in main.cpp inkludiert?



  • Der Compiler scheint durchzulaufen, weil es sich um eine Linker Fehlermeldung handelt. Hast du die entsprechenden .lib Dateien des SDL Pakets in das Projekt eingebunden?



  • Aber der meckert ja wegen seiner Methode.

    Ist die Quellcodedatei zum Projekt hinzugefügt worden?



  • Da der Linker über doppelt definierte Symbole meckert, tippe ich darauf, dass er die .cpp Datei mit #include "lol.cpp" inkludiert hat und sie im Projekt hinzugefügt ist.



  • Du hast (vermutlich über #includes) eine Definition von load_img in die Übersetzungseinheit der main.cpp geholt.
    Die hast du aber über "lol.cpp" auch schon in deren Übersetzungseinheit. Zweimal die selbe Funktionsdefinition in zwei Übersetzugnseinheiten erzeugt den Linkerfehler.
    Du hast also entweder die lol.cpp in die main.cpp eingebunden, oder die (bzw. eine) Definition der Funktion steht nicht in der lol.cpp sondern in der lol.h, die du vermutlich in die main.cpp einbindest.
    Zeig uns daher mal bitte getrennt (d.h. so, dass man erkennen kann welcher Code in welcher Datei steht) folgendes:
    - lol.cpp
    - lol.h
    - main.cpp

    PS: <stdio.h> ist kein C++. Die heist <cstdio>



  • Also,
    main.cpp:

    #include "SDL.h"
    #include <stdlib.h>
    #include "lol.cpp"
    
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 480;
    
    SDL_Surface* g_pDisplaySurface = NULL;
    SDL_Event g_Event;
    SDL_Rect g_Rect;
    SDL_Surface* lol = NULL;
    
    Uint8 g_Red, g_Green, g_Blue;
    Uint32 g_Color;
    
    int main(int argc, char* argv[])
    {	
    	lol = load_img("tux.bmp");
    	SDL_Init(SDL_INIT_VIDEO);
    	atexit(SDL_Quit);
    	g_pDisplaySurface = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, SDL_ANYFORMAT);
    	g_Rect.x = 50;
    	for (;;)
    	{
    		if (SDL_PollEvent(&g_Event)==0)
    		{
    			g_Red=rand()%256;
    			g_Green=rand()%256;
    			g_Blue=rand()%256;
    			g_Color=SDL_MapRGB(g_pDisplaySurface->format, g_Red, g_Green, g_Blue);
    
    			g_Rect.y = 50;
    			g_Rect.w = 100;
    			g_Rect.h = 100;
    			SDL_FillRect(g_pDisplaySurface, &g_Rect, g_Color);
    			SDL_UpdateRect(g_pDisplaySurface, 0, 0, 0, 0);
    			g_Rect.x+=5;
    			SDL_Delay(30);
    		}
    		else
    		{
    			if (g_Event.type == SDL_QUIT)
    			{
    				break;
    			}
    		}
    	}
    	return (0);
    }
    

    lol.h

    #include "SDL.h"
    #include <string>
    SDL_Surface* load_img(std::string filename);
    

    lol.cpp

    #include <stdio.h>
    #include <string>
    #include "SDL.h"
    #include "SDL_image.h"
    #include "lol.h"
    
    SDL_Surface* load_img(std::string filename)
    {	
    	SDL_Surface *loadimg = NULL;
    	SDL_Surface *newimg = NULL;
    
    	loadimg = IMG_Load(filename.c_str() );
    
    	if(loadimg != NULL)
    	{
    		fprintf(stdout,"Bildv0.5 geladen: ", filename);
    		newimg = SDL_DisplayFormat(loadimg);
    		SDL_FreeSurface(loadimg);
    		if(newimg != NULL)
    		{
    			fprintf(stdout,"Bildv.1 geladen: ",filename);
    		}
    		else
    		{
    			fprintf(stderr, "Bildv.1 geladen: ", filename);
    			return 0;
    		}
    	}
    	else
    	{
    		fprintf(stderr, "Bildv0.5 nicht geladen: ", filename);
    		return 0;
    	}
    	return newimg;
    }
    

    Die libs(SDL.lib, SDLmain.lib, SDL_image.lib) sind alle in das Projekt eingebunden.



  • Wie schon befürchtet: du hast eine .cpp eingebunden statt des headers.
    main.cpp:3 muss heißen

    #include "lol.h"
    

    PS: <stdlib.h> -> <cstdlib>, <stdio.h> -> <cstdio>
    (die entsprechenden Funktionen sind dann im namespace std)



  • Danke, funktioniert jetzt alles. Ich hatte einfach nicht mit einem so trivialem Problem gerechnet 😕



  • Jo, wie ich sagte:
    Du hast lol.cpp per #include eingebunden.
    Das ist nicht korrekt.
    Man bindet nur Header mit der Deklaration ein. Die .cpp Datei mit er Definition wird nur dem Projekt hinzugefügt.
    Dann hast auch diese Fehler nicht.


Anmelden zum Antworten