2014-03-04 34 views
0

我想在终端中使用gcc编译一个简单的SDL/OpenGL程序。下面是代码(main.c中):SDL 2.0/OpenGL代码不会编译

#include <stdio.h> 
#include <stdlib.h> 
/* If using gl3.h */ 
/* Ensure we are using opengl's core profile only */ 
#include<GL/glew.h> 
#define GL3_PROTOTYPES 1 
#include <GL/gl.h> 

#include <SDL.h> 
#define PROGRAM_NAME "Tutorial1" 

/* A simple function that prints a message, the error code returned by SDL, 
* and quits the application */ 
void sdldie(const char *msg) 
{ 
    printf("%s: %s\n", msg, SDL_GetError()); 
    SDL_Quit(); 
    exit(1); 
} 


void checkSDLError(int line) 
{ 
#ifndef NDEBUG 
    const char *error = SDL_GetError(); 
    if (*error != '\0') 
    { 
     printf("SDL Error: %s\n", error); 
     if (line != -1) 
      printf(" + line: %i\n", line); 
     SDL_ClearError(); 
    } 
#endif 
} 


/* Our program's entry point */ 
int main(int argc, char *argv[]) 
{ 
    SDL_Window *mainwindow; /* Our window handle */ 
    SDL_GLContext maincontext; /* Our opengl context handle */ 

    if (SDL_Init(SDL_INIT_VIDEO) < 0) /* Initialize SDL's Video subsystem */ 
     sdldie("Unable to initialize SDL"); /* Or die on error */ 

    /* Request opengl 3.2 context. 
     * SDL doesn't have the ability to choose which profile at this time of writing, 
       * but it should default to the core profile */ 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); 

    /* Turn on double buffering with a 24bit Z buffer. 
     * You may need to change this to 16 or 32 for your system */ 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); 

    /* Create our window centered at 512x512 resolution */ 
    mainwindow = SDL_CreateWindow(PROGRAM_NAME, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 
            512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); 
    if (!mainwindow) /* Die if creation failed */ 
     sdldie("Unable to create window"); 

    checkSDLError(__LINE__); 

    /* Create our opengl context and attach it to our window */ 
    maincontext = SDL_GL_CreateContext(mainwindow); 
    checkSDLError(__LINE__); 


    /* This makes our buffer swap syncronized with the monitor's vertical refresh */ 
    SDL_GL_SetSwapInterval(1); 

    /* Clear our buffer with a red background */ 
    glClearColor (1.0, 0.0, 0.0, 1.0); 
    glClear (GL_COLOR_BUFFER_BIT); 
    /* Swap our back buffer to the front */ 
    SDL_GL_SwapWindow(mainwindow); 
    /* Wait 2 seconds */ 
    SDL_Delay(2000); 

    /* Same as above, but green */ 
    glClearColor (0.0, 1.0, 0.0, 1.0); 
    glClear (GL_COLOR_BUFFER_BIT); 
    SDL_GL_SwapWindow(mainwindow); 
    SDL_Delay(2000); 

    /* Same as above, but blue */ 
    glClearColor (0.0, 0.0, 1.0, 1.0); 
    glClear (GL_COLOR_BUFFER_BIT); 
    SDL_GL_SwapWindow(mainwindow); 
    SDL_Delay(2000); 

    /* Delete our opengl context, destroy our window, and shutdown SDL */ 
    SDL_GL_DeleteContext(maincontext); 
    SDL_DestroyWindow(mainwindow); 
    SDL_Quit(); 

    return 0; 
} 

当我尝试编译这段代码:

gcc -o ./bin/gl_nbody -I/usr/local/include/SDL2 -g -lGLEW -lGL -lX11 -lSDL2 -Wl,-rpath,/usr/local/lib -L/usr/local/lib ./src/main.c 

我收到以下错误:

/tmp/ccg0glmq.o: In function `sdldie': 
/home/jared/projects/gl_nbody/./src/main.c:16: undefined reference to `SDL_GetError' 
/home/jared/projects/gl_nbody/./src/main.c:17: undefined reference to `SDL_Quit' 
/tmp/ccg0glmq.o: In function `checkSDLError': 
/home/jared/projects/gl_nbody/./src/main.c:25: undefined reference to `SDL_GetError' 
/home/jared/projects/gl_nbody/./src/main.c:31: undefined reference to `SDL_ClearError' 
/tmp/ccg0glmq.o: In function `main': 
/home/jared/projects/gl_nbody/./src/main.c:43: undefined reference to `SDL_Init' 
/home/jared/projects/gl_nbody/./src/main.c:49: undefined reference to `SDL_GL_SetAttribute' 
/home/jared/projects/gl_nbody/./src/main.c:50: undefined reference to `SDL_GL_SetAttribute' 
/home/jared/projects/gl_nbody/./src/main.c:54: undefined reference to `SDL_GL_SetAttribute' 
/home/jared/projects/gl_nbody/./src/main.c:55: undefined reference to `SDL_GL_SetAttribute' 
/home/jared/projects/gl_nbody/./src/main.c:58: undefined reference to `SDL_CreateWindow' 
/home/jared/projects/gl_nbody/./src/main.c:66: undefined reference to `SDL_GL_CreateContext' 
/home/jared/projects/gl_nbody/./src/main.c:71: undefined reference to `SDL_GL_SetSwapInterval' 
/home/jared/projects/gl_nbody/./src/main.c:74: undefined reference to `glClearColor' 
/home/jared/projects/gl_nbody/./src/main.c:75: undefined reference to `glClear' 
/home/jared/projects/gl_nbody/./src/main.c:77: undefined reference to `SDL_GL_SwapWindow' 
/home/jared/projects/gl_nbody/./src/main.c:79: undefined reference to `SDL_Delay' 
/home/jared/projects/gl_nbody/./src/main.c:82: undefined reference to `glClearColor' 
/home/jared/projects/gl_nbody/./src/main.c:83: undefined reference to `glClear' 
/home/jared/projects/gl_nbody/./src/main.c:84: undefined reference to `SDL_GL_SwapWindow' 
/home/jared/projects/gl_nbody/./src/main.c:85: undefined reference to `SDL_Delay' 
/home/jared/projects/gl_nbody/./src/main.c:88: undefined reference to `glClearColor' 
/home/jared/projects/gl_nbody/./src/main.c:89: undefined reference to `glClear' 
/home/jared/projects/gl_nbody/./src/main.c:90: undefined reference to `SDL_GL_SwapWindow' 
/home/jared/projects/gl_nbody/./src/main.c:91: undefined reference to `SDL_Delay' 
/home/jared/projects/gl_nbody/./src/main.c:94: undefined reference to `SDL_GL_DeleteContext' 
/home/jared/projects/gl_nbody/./src/main.c:95: undefined reference to `SDL_DestroyWindow' 
/home/jared/projects/gl_nbody/./src/main.c:96: undefined reference to `SDL_Quit' 

看来,这将表明我错误地包含了SDL2库。但是,我认为这是用-lSDL2选项处理的。关于这里有什么问题的任何想法?

+0

也许你错过了-lSDL2main – jordsti

+0

你缺少-L参数,你应该用类似的东西编译用于libSDL2.a所在的目录。可能-L/usr/local/lib – cup

+0

@cup你读过所有的gcc命令行吗?因为它已经存在... – jordsti

回答

0

在linux上,您应该不是包括-lSDL2,但使用SDL2-config脚本。它有一些奇怪的依赖关系,只有脚本可以解决它。

gcc -o ./bin/gl_nbody -I/usr/local/include/SDL2 `sdl-config --cflags --libs` -g -lGLEW -lGL -lX11 -Wl,-rpath,/usr/local/lib -L/usr/local/lib ./src/main.c

在SDL维基常见问题解答显示更多的细节如何做到这一点:http://wiki.libsdl.org/FAQLinux