使用SDL和GLEW设置Visual Studio项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用SDL和GLEW设置Visual Studio项目相关的知识,希望对你有一定的参考价值。

我是使用Visual Studio和OpenGL和SDL库的新手。

我在设置程序时遇到问题,并在尝试构建程序时遇到错误。

任何人都可以帮我解决以下问题 -

Error   1   error LNK2019: unresolved external symbol __imp__glewInit@0 referenced in function _SDL_main    
Error   2   error LNK2019: unresolved external symbol __imp__glewGetErrorString@4 referenced in function _SDL_main  
Error   3   error LNK2001: unresolved external symbol __imp____GLEW_VERSION_3_0 
Error   4   error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup   
Error   5   error LNK1120: 4 unresolved externals   
    6   IntelliSense: identifier "GLuint" is undefined  
    7   IntelliSense: identifier "GLuint" is undefined  

这是我的代码 -

main.c中

#include<SDL.h>
#include<GLglew.h>
#include <stdio.h>

char shouldExit = 0;
int main(void)
{
    /* Initialize SDL *l
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
    return 1;
    }
    /* Create the window, OpenGL context */
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_Window* window = SDL_CreateWindow(
        "TestSDL",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
        640, 480,
        SDL_WINDOW_OPENGL);
    if (!window) {
        fprintf(stderr, "Could not create window.ErrorCode = %s
", SDL_GetError());
        SDL_Quit();
        return 1;
    }
    SDL_GL_CreateContext(window);
    /* Make sure we have a recent version of OpenGL */
    GLenum glewError = glewInit();
    if (glewError != GLEW_OK) {
        fprintf(stderr, "Could not initialize glew.ErrorCode = %s
", glewGetErrorString(glewError));
        SDL_Quit();
        return 1;
    }
    if (!GLEW_VERSION_3_0) {
        fprintf(stderr, "OpenGL max supported version is too low.
");
        SDL_Quit();
        return 1;
    }
    /* Setup OpenGL state */
    glViewport(0, 0, 640, 480);
    glMatrixMode(GL_PROJECTION);
    glOrtho(0, 640, 480, 0, 0, 100);
    glEnable(GL_TEXTURE_2D);
    /* The game loop */
    while (!shouldExit) {
        // Handle OS message pump
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            switch (event.type) {
            case SDL_QUIT:
                shouldExit = 1;
            }
        }
        glClearColor(0, 0, 0, 1);
        glClear(GL_COLOR_BUFFER_BIT);
        /* Game logic goes here */
        SDL_GL_SwapWindow(window);
    }
    SDL_Quit();
    return 0;
}

DrawUtils.c

/***********************************************************************
 Utilities for loading and drawing sprites.
*/
#include<GL/glew.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

/* Load a file into an OpenGL texture, and return that texture. */
GLuint glTexImageTGAFile( const char* filename, int* outWidth, int* outHeight )
{
    const int BPP = 4;

    /* open the file */
    FILE* file = fopen( filename, "rb" );
    if( file == NULL ) {
        fprintf( stderr, "File: %s -- Could not open for reading.
", filename );
        return 0;
    }

    /* skip first two bytes of data we don't need */
    fseek( file, 2, SEEK_CUR );

    /* read in the image type.  For our purposes the image type should
     * be either a 2 or a 3. */
    unsigned char imageTypeCode;
    fread( &imageTypeCode, 1, 1, file );
    if( imageTypeCode != 2 && imageTypeCode != 3 ) {
        fclose( file );
        fprintf( stderr, "File: %s -- Unsupported TGA type: %d
", filename, imageTypeCode );
        return 0;
    }

    /* skip 9 bytes of data we don't need */
    fseek( file, 9, SEEK_CUR );

    /* read image dimensions */
    int imageWidth = 0;
    int imageHeight = 0;
    int bitCount = 0;
    fread( &imageWidth, sizeof( short ), 1, file );
    fread( &imageHeight, sizeof( short ), 1, file );
    fread( &bitCount, sizeof( unsigned char ), 1, file );
    fseek( file, 1, SEEK_CUR );

    /* allocate memory for image data and read it in */
    unsigned char* bytes = (unsigned char*)calloc( imageWidth * imageHeight * BPP, 1 );

    /* read in data */
    if( bitCount == 32 ) {
        int it;
        for( it = 0; it != imageWidth * imageHeight; ++it ) {
            bytes[ it * BPP + 0 ] = fgetc( file );
            bytes[ it * BPP + 1 ] = fgetc( file );
            bytes[ it * BPP + 2 ] = fgetc( file );
            bytes[ it * BPP + 3 ] = fgetc( file );
        }
    } else {
        int it;
        for( it = 0; it != imageWidth * imageHeight; ++it ) {
            bytes[ it * BPP + 0 ] = fgetc( file );
            bytes[ it * BPP + 1 ] = fgetc( file );
            bytes[ it * BPP + 2 ] = fgetc( file );
            bytes[ it * BPP + 3 ] = 255;
        }
    }

    fclose( file );

    /* load into OpenGL */
    GLuint tex;
    glGenTextures( 1, &tex );
    glBindTexture( GL_TEXTURE_2D, tex );
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, imageWidth, imageHeight, 0,
                  GL_BGRA, GL_UNSIGNED_BYTE, bytes );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );

    free( bytes );

    if( outWidth ) {
        *outWidth = imageWidth;
    }
    if( outHeight ) {
        *outHeight = imageHeight;
    }
    return tex;
}

/* Draw the sprite */
void glDrawSprite( GLuint tex, int x, int y, int w, int h )
{
    glBindTexture( GL_TEXTURE_2D, tex );
    glBegin( GL_QUADS );
    {
    glColor3ub( 255, 255, 255 );
    glTexCoord2f( 0, 1 );
    glVertex2i( x, y );
    glTexCoord2f( 1, 1 );
    glVertex2i( x + w, y );
    glTexCoord2f( 1, 0 );
    glVertex2i( x + w, y + h );
    glTexCoord2f( 0, 0 );
    glVertex2i( x, y + h );
    }
    glEnd();
}

DrawUtils.h

#ifndef DRAWUTILS_H
#define DRAWUTILS_H

#ifdef __cplusplus
extern "C" {
#endif

GLuint glTexImageTGAFile( const char* filename, int* outWidth, int* outHeight );
void glDrawSprite( GLuint tex, int x, int y, int w, int h );

#ifdef __cplusplus
}
#endif

#endif

我错过了#include吗?

答案

不,你错过了一个图书馆。你包括GLEW头文件:

#include<GLglew.h>

但是,头文件只定义函数原型(例如glewInit()) - 这些函数的实际实现将存储在.lib(或.a)文件中,您必须链接该文件才能构建项目。

我使用Visual Studio已经有一段时间了,但我认为您通常会将链接器选项设置为项目配置的一部分。但是,如果必须,可以在代码中指定链接器选项:

#pragma comment(lib, "glew/glew32s.lib")

请注意,#pragma方法是特定于MSVC的,可能不适用于其他编译器。

如果您无法摆弄链接器选项,那么您可以随时使用add glew.c to your project


另一件事:你在GLuint中使用DrawUtils.h而不包括gl.hglew.h

GLuint glTexImageTGAFile( const char* filename, int* outWidth, int* outHeight );
void glDrawSprite( GLuint tex, int x, int y, int w, int h );
另一答案

关于Visual Studio 2017,OpenGL,SDL2和GLEW,我推荐this网页。我只复制和粘贴文本。

A部分 - 下载SDL和GLEW

A1创建一个OpenGL文件夹。在目录(磁盘)C:中,创建一个名为OpenGL的新文件夹(通过右键单击>新建>文件夹)。

A2下载SDL2-devel-2.0.8-VC.zip(Visual C ++ 32/64位)。它可以在https://www.libsdl.org/download-2.0.php找到。滚动到页面底部,找到开发库。

A2a下载Visual C ++版本。它是SDL2-devel-2.0.8-VC.zip(Visual C ++ 32/64位)。导航(始终双击)到C:> OpenGL。

A2b将文件夹SDL2-2.0.8从下载窗口拖拽(或通过右键单击,复制并粘贴)到文件夹OpenGL中。

A2c如果下载了文件夹SDL2-devel-2.0.8-VC,请双击它以获得SDL2-2.0.8。

A3下载GLEW。在下面的http://glew.sourceforge.net/下单击Windows 32位和64位。导航到C:> OpenGL。将文件夹glew-2.1.0从下载窗口拖放(或通过右键单击,复制并粘贴)到文件夹* OpenGL中。

A3a如果下载了文件夹glew-2.1.0-win32,请双击它以获取glew-2.1.0。

B部分 - 创建Visual Studio项目

B1创建一个空项目。

B1a在Visual Studio主菜单中,单击“文件”。然后转到New> Project ...

B1b在“新建项目”窗口的左侧部分,如果未单击,则单击“Visual C ++”。

B1c在屏幕中央单击“清空项目”。

B1d在其下方,找到名称文本框,键入Project-0。

B1e在“位置”文本框旁边,单击“浏览...”并导航到C:> OpenGL。

B1f单击“选择文件夹”。 “新建项目”窗口中的“位置”为C: OpenGL。

B1g确保未选中“为解决方案创建目录”框。

B1h单击“确定”。

B2将源文件添加到项目中。

B2a在Solution Explorer窗口(屏幕左侧)中,右键单击Source Files文件夹(最后一个)。

B2b单击添加>新项...

B2c在Add New Item - Project-0窗口中,单击窗口中间的C ++ File(.cpp)(第一个)。在名称文本框中键入Main.cpp。

B2D。位置是C: OpenGL Project-0。

B2e单击“添加”按钮。该文件将在主文本编辑器中打开,但暂时将该文件留空。

C部分 - 在项目上安装SDL和GLEW

C1添加Include文件夹。

C1a配置其他包含目录:在解决方案资源管理器中,右键单击项目名称,即Project-0,然后选择“属性”。

C1b添加SDL的include文件夹:打开C / C ++下拉菜单。单击字段右侧的常规>其他包含目录>向下箭头>在下拉菜单中编辑。

C1c在其他包含目录中,单击第一个图标>复制并粘贴,C: OpenGL SDL2-2.0.8 include

C1d添加GLEW的include文件夹:再次单击第一个图标>复制并粘贴:C: OpenGL glew-2.1.0 include在Additional Include Directories窗口中单击OK。

C2添加x86和Win32文件夹。

C2a配置链接器其他库目录:打开“链接器”下拉菜单,然后单击“常规”。

C2b添加x86文件夹:单击“其他库目录”条目,然后单击该字段右侧的向下箭头。单击下拉菜单中的“编辑”。

C2c在其他库目录中单击第一个图标>复制并粘贴,C: OpenGL SDL2-2.0.8 lib x86

C2d添加Win32文件夹:单击第一个图标>复制并粘贴,C: OpenGL glew-2.1.0 lib Release Win32单击“确定”。

C3添加四个库文件。

C3a配置链接器附加依赖项:在“链接器”下拉菜单中,单击“输入”。单击字段右侧的“附加依赖项”>“向下”箭头>“编辑”,然后单击下拉菜单中的“编辑”。

C3b在Additional Dependencies窗口的最顶部文本框中,复制并粘贴SDL2.lib; SDL2main.lib; glew32.lib; opengl32.lib在Additional Dependencies窗口中单击OK。

C4将链接器子系统配置为控制台。

C4a在“链接器”下拉菜单中,单击“系统”>“子系统”。单击向下箭头,然后从下拉菜单中选择Console(/ SUBSYSTEM:CONSOLE)。在Project Property Pages窗口中单击Apply,然后单击OK。

C5从x86文件夹复制SDL2.dll文件,并粘贴到Project-0文件夹。

C5a导航到C:> OpenGL> SDL2-2.0.8> lib> x86。在x86文件夹中单击SDL2.dll文件>右键单击>复制。

C5b导航到C:> OpenGL> Project-0。右键单击Project-0文件夹中的空白区域,然后选择“粘贴”。

C5c SDL2.dll文件现在应该与您的Main.cpp文件以及Visual Studio创建的一些其他文件一起位于项目目录中。

C6从Win32复制glew32.dll文件并粘贴到Project文件夹。

C6a导航到C:> OpenGL> glew-2.1.0> bin> Release> Win32。单击glew32.dll>右键单击>复制。

C6b导航到C:> OpenGL> Project-0。右键单击Project-0文件夹中的空白区域,然后选择“粘贴”。

C6c glew32.dll文件现在应该与Main.cpp,SDL2.dll以及Visual Studio创建的一些其他文件一起位于Project-0文件夹中。

D部分 - 测试和调试您的项目

D1下载代码:点击http://lazyfoo.net/tutorials/SDL/51_SDL_and_modern_opengl/index.php>向下滚动查找下载本教程的媒体和源代码。单击此处并下载51_SDL_and_modern_opengl.cpp文件夹。双击它>双击同名文件。它的代码将出现在Main.cpp文件一侧的Visual Studio中。复制代码(413行)并粘贴到Main.cpp代码区域。在V.S.主菜单单击绿色箭头本地Windows调试器并等待...如果一切顺利,将出现两个窗口:一个黑色和一个带标题:SDL教程和黑色背景的白色方块内。如果有任何问题,请尝试修复错误。如果失败,请重复上述步骤。

E部分 - 在Visual Studio 2017中使用OpenGL-SDL-GLEW模板创建项目

E1创建项目模板:转到Visual Studio主菜单,当Project-0打开时,单击项目>导出模板....导出模板向导检查项目模板,如果未选中。单击下一步>。在“选择模板选项”的“模板名称”文本框中键入:OpenGL-SDL-GLEW。单击完成。模板已创建。

E2使用创建的模板创建OpenGL-SDL-GLEW项目

E2a On V.S.主菜单单击File> New> Project ....在New Project窗口中,单击template:OpenGL-SDL-GLEW。在“名称”文本字段中,键入:Project-1。确保未选中“为解决方案创建目录”。单击确定。

E2b在解决方案资源管理器中,双击“源文件”。单击Main.cpp>右键单击>单击从项目中排除。

E2c右键单击源文件>添加>新项....在添加新项 - 项目-1窗口中,单击C ++文件(.cpp)。在名称中:文本框类型:Main.cpp。位置应为C: OpenGL Project-1。单击添加。现在解决方案探索,在源文件下,您有新的Main.cpp文件。

E3将SDL2.dll文件添加到项目文件夹

E3a导航到C:> OpenGL> Project-0>单击文件SDL2.dll>右键单击>单击“复制”。

E3b导航到C:> OpenGL> Project-1>单击空白区域>右键单击>单击粘贴。

E3c现在文件SDL2.dll位于Main.cpp和其他4个文件中的Project-1文件夹中。

E4将glew32.dll文件添加到项目文件夹

E4a导航到C:> OpenGL> Project-0>单击文件gl​​ew32.dll>右键单击>单击“复制”。

E4b导航到C:> OpenGL> Project-1>单击空白区域>右键单击>单击粘贴。

E4c现在文件glew32.dll位于SDL2.dll,Main.cpp和其他4个文件中的Project-1文件夹中。

E5如上所述测试您的项目。做得好。

小费

请记住您必须采取的3个额外步骤:在Visual Studio 2017中使用OpenGL-SDL-GLEW模板创建项目就像创建一个普通的C ++项目,但还有三个步骤:

1在解决方案资源管理器,源文件中,应从新项目(示例中为Project-1)中排除模板项目(示例中为Project-0)的源文件(上例中的Main.cpp)。

2应从先前项目复制文件SDL2.dll并粘贴到新项目中。

3应从先前项目复制文件glew32.dll并粘贴到新项目中。

以上是关于使用SDL和GLEW设置Visual Studio项目的主要内容,如果未能解决你的问题,请参考以下文章

使用 glfw3 glew 和 opengl 在 Visual Studio 社区中获取访问冲突异常

OpenGL 开发环境配置:Visual Studio 2017 + GLFW + GLEW

OpenGL 深度测试不工作 (GLEW/SDL2)

如何在 Visual Studio 2008 Express 中获得一个最小的 SDL 程序来编译和链接?

Visual Studio 不使用 SDL 渲染图像

Visual Studio 2017 C2027 使用未定义类型“SDL_Texture”