2012-03-14 9 views
1

私は単純な動作を拒否する単純なopenGLとSDLプログラムを構築しようとしています。SDLとOpenGLプログラムのコンパイルに失敗しました

私は、最新のNVIDIAドライバ(私が覚えていれば285.something)を使用していると私はコンパイルするためにmingwのを使用しています。私が使用するマシンはWindows7を実行します。 mingwについての私の知識は幾分限られているので、これは非常に単純なリンクエラーかもしれません。

使用してSDLイムのバージョンは1.2です(私は1.3にアップグレードする必要がありますか?)

まず、すべてがうまく働いたが、私は単にSDLを通じてOpenGLのウィンドウを開きました。すべてがうまく働いていた、そのコードで

#include "SDL/SDL.h" 
#include "SDL/SDL_image.h" 
#include "SDL/SDL_opengl.h" 
#include <iostream> 
#include <fstream> 
#include <vector> 
#include <algorithm> 

: ここで、元のmakefile

all: 
g++ -o sdlGL.exe esg.cpp tiletest.cpp -lmingw32 -lSDLmain -lSDL -lopengl32 -lglu32 

ためのコードだとこれらは、介在物のための今すぐ

void init_sdl(int width, int height) { 
     //Start SDL 
     if(SDL_Init(SDL_INIT_EVERYTHING) != 0) { 
      fDebug << "Failed to init SDL" << std::endl; 
      quit(1); 
     } 

     //Set SDL attrib. 
     SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); 
     SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); 
     SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); 
     SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); 
     SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); 
     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 

     //Set SDL video mode 
     if(SDL_SetVideoMode(width, height, 0, SDL_OPENGL) == 0) { 
      fDebug << "Failed to set SDL video mode" << std::endl; 
      quit(1); 
     } 
    } 

    //Initializes OpenGL 
    void init_opengl(int width, int height, bool alpha) { 
     // Set the OpenGL state after creating the context with SDL_SetVideoMode 
     glClearColor(0, 0, 0, 0); 
     glClear(GL_COLOR_BUFFER_BIT); 
     glEnable(GL_TEXTURE_2D); // Need this to display a texture 

     if(alpha) { 
      glEnable (GL_BLEND); 
      glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
     } 

     glViewport(0, 0, width, height); 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(0, width, height, 0, -1, 1); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
    } 

と呼ばれた2つの機能です。 はその後、私はシェーダとシェーダプログラム今

void CreateShader(GLenum eShaderType, const std::string &strShaderFile, std::vector<GLuint> &shaderList) { 
     GLuint shader = glCreateShader(eShaderType); 
     const char *strFileData = strShaderFile.c_str(); 
     glShaderSource(shader, 1, &strFileData, NULL); 

     glCompileShader(shader); 

     GLint status; 
     glGetShaderiv(shader, GL_COMPILE_STATUS, &status); 


     shaderList.push_back(shader); 
    } 

    void ClearShader(std::vector<GLuint> &shaderList) { 
     std::for_each(shaderList.begin(), shaderList.end(), glDeleteShader); 
    } 

    GLuint CreateProgram(const std::vector<GLuint> &shaderList) { 
     GLuint program = glCreateProgram(); 

     for(size_t iLoop = 0; iLoop < shaderList.size(); iLoop++) 
      glAttachShader(program, shaderList[iLoop]); 

     glLinkProgram(program); 

     GLint status; 
     glGetProgramiv (program, GL_LINK_STATUS, &status); 

     for(size_t iLoop = 0; iLoop < shaderList.size(); iLoop++) 
      glDetachShader(program, shaderList[iLoop]); 

     return program; 
    } 

の世話をするためにいくつかの機能を追加し、コンパイラはそのglCreateShader、glShaderSource、glCompileShader、glGetShaderiv、glDeleteShader、glCreateProgram、glAttachShader、glLinkProgram、glGetProgramiv不平を言うとglDetachShaderがで宣言されていませんでしたこの範囲。

私はgleeかglew(右か?)を含める必要があると思ったので、私はglewと行きました。 私は、今、コンパイラはglew.hため、エラーのトンを示しています、私のメイクに-glew32を追加しましたし、私の介在物に

#include "GL/glew.h" 

をglew.h追加などの----タイプに名前を付けていません - - この範囲では宣言されなかった。

これを解決するために何をすべきかわかりません。 私はOpenGLであまり経験がないことを付け加えておきます。

+1

エラーはなんですか? – Dikei

+0

私は少し要約する必要がありますね!私がmakefileに-lglew32を追加して "glew.h"をインクルードすると、glewでエラーが発生します。これを言ったり、これがこのスコープなどで宣言されていなかったりしました。 – SamHLec

+2

'#include 'がファイルの最上部にあることを確認してください - 正常に動作するためには標準のOpenGLヘッダファイルの前にインクルードする必要があります。 –

答えて

4

GLEWは、プラットフォーム固有の#includeをGLヘッダーに使用するため、SDL_opengl.hは不要です。また、適切なGLUヘッダーの#includeも必要です。

Xavierは他のものよりも先に#include <GL/glew.h>を指摘しました。私が正しく思い出すと、それはwindows.hと矛盾する傾向があります。

+0

さて、それはうまくいくと思います。私は最初のglew.hをインクルードするようにコードを修正しました。シェーダに関するいくつかのエラーが出てきています。私が今使っているコンピュータは、統合されたグラフィックカードを持っているからです(私は仕事中です)。私は家で再びテストし、結果を発表します。 – SamHLec

1

私はその後、私のメイクに-glew32を追加しましたし、私の介在物に

-glew32をglew.h追加それは-lglew32だ、右ではありません。 #include <GL/glew.h>ヘッダーは、OpenGLとやり取りする他のものよりも前に含まれている必要があります。

+0

おっと、ここで少しタイプミスは、私は 'が-lgew32' – SamHLec

+0

を意味しました –

+0

も私は'大文字にそれを変更し-lGLEW'し、それが働いたを見つけることができません取得-lglew32 –

関連する問題