Fehlermeldung in SDL

meifer

Grünschnabel
Ich bekomm ne Fehlermeldung in SDL wenn ich Pixel zeichnen möchte:

error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl DrawPixel(struct SDL_Surface *,int,int,unsigned char,unsigned char,unsigned char)" (?DrawPixel@@YAXPAUSDL_Surface@@HHEEE@Z)" in Funktion "_main".

Ich weiß das des ein Linker-Fehler ist, aber ich hab alle .libs verlinkt, die ich aufm PC habe, also SDL.lib, SDLmain.lib und SDL_image.lib. Aber anscheinend fehlt noch eine, kann mir jemand sagen welche es ist? Ich wäre euch sehr dankbar.

gruß meifer
 
Hi.

Zeig doch mal deine SDL-Spezifischen includes und dein
Compileraufruf oder dein Makefile. In welcher Umgebung
arbeitest du : os, ide, compiler ?

Gruß Benny
 
Der Code stammt aus einem Tutorial, und ich hab auch schon das Problem herausgefunden.

Code:
#include <stdlib.h>
#include "SDL.h"
#include "SDL_image.h"

// Fuer einen 24-Bit-Modus unabhaengig von der Bytereihenfolge.
// Wird von also DrawPixel() benoetigt
#include "SDL_endian.h"

#ifdef _WIN32
#undef main
#endif

void DrawPixel(SDL_Surface *screen, int x, int y,Uint8 R, Uint8 G, Uint8 B);

int main()
{
    SDL_Surface *display;

    // init video stuff
    if ( SDL_Init( SDL_INIT_VIDEO) < 0 )
    {
       fprintf(stderr, "SDL konnte nicht initialisiert werden:  %s\n", SDL_GetError());
       exit(1);
     }

    atexit(SDL_Quit);

    // init screen
    display = SDL_SetVideoMode( 800, 600, 16, SDL_SWSURFACE);
    if ( display == NULL )
    {
      fprintf(stderr, "Konnte kein Fenster 640x480px oeffnen: %s\n", SDL_GetError());
      exit(1);
    }

for( int x=0; x < 800; x++ )
{
    DrawPixel( display, x, display->h/2, 255, 255, 255);
}

SDL_Flip(display);

SDL_Delay(3000);
}

Das Problem war das mein Compiler (Visual C++ 2005) einen Linker-Fehler angzeigt hat. Irgendwann hab ich mir dann den Code angeschaut von SDL_endian.h und hab gemerkt das meine Funktion, die laut dem Tutorial in der Header-datei seien sollte, nicht vorhanden ist. Ich habe den Code dort hineinkopiert und jetzt funktioniert alle fehlerfrei.

Hier ist der Code:
Code:
void DrawPixel(SDL_Surface *screen, int x, int y,Uint8 R, Uint8 G,Uint8 B)
{
    Uint32 color = SDL_MapRGB(screen->format, R, G, B);

    if ( SDL_MUSTLOCK(screen) )
    {
        if ( SDL_LockSurface(screen) < 0 ) {
            return;
        }
    }

    switch (screen->format->BytesPerPixel) {
        case 1: { /* vermutlich 8 Bit */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
            *bufp = color;
        }
        break;

        case 2: { /* vermutlich 15 Bit oder 16 Bit */
            Uint16 *bufp;

            bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
            *bufp = color;
        }
        break;

        case 3: { /* langsamer 24-Bit-Modus, selten verwendet */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
            if(SDL_BYTEORDER == SDL_LIL_ENDIAN) {
                bufp[0] = color;
                bufp[1] = color >> 8;
                bufp[2] = color >> 16;
            } else {
                bufp[2] = color;
                bufp[1] = color >> 8;
                bufp[0] = color >> 16;
            }
        }
        break;

        case 4: { /* vermutlich 32 Bit */
            Uint32 *bufp;

            bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
            *bufp = color;
        }
        break;
    }

    if ( SDL_MUSTLOCK(screen) )
    {
        SDL_UnlockSurface(screen);
    }

}
Wie gesagt jetzt funktioniert alles fehlerfrei.
 
Der Code stammt aus einem Tutorial, und ich hab auch schon das Problem herausgefunden.

Das Problem war das mein Compiler (Visual C++ 2005) einen Linker-Fehler angzeigt hat. Irgendwann hab ich mir dann den Code angeschaut von SDL_endian.h und hab gemerkt das meine Funktion, die laut dem Tutorial in der Header-datei seien sollte, nicht vorhanden ist.
Da hast du vermutlich etwas falsch verstanden. Die Funktion DrawPixel ist nicht Teil der SDL. Funktionen werden auch nicht in Header Dateien definiert sondern nur deklariert. Daher ist es auch keine besonders gute Idee die Funktion da einfach einzufügen.

Gruß
 
sry hab mich wohl ein bisserl falsch ausgedrückt ich hab die nicht in SDL hineinkopiert sondern in meinem Code.
mfg meifer
 

Neue Beiträge

Zurück