使用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.h
或glew.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>单击文件glew32.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