gpt4 book ai didi

c++ - 使用 SDL 和 GLEW 设置 Visual Studio 项目

转载 作者:太空狗 更新时间:2023-10-29 21:41:37 24 4
gpt4 key购买 nike

我刚开始使用 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

这是我的代码-

主.c

#include<SDL.h>
#include<GL\glew.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\n", 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\n", glewGetErrorString(glewError));
SDL_Quit();
return 1;
}
if (!GLEW_VERSION_3_0) {
fprintf(stderr, "OpenGL max supported version is too low.\n");
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.\n", 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\n", 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<GL\glew.h>

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

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

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

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

如果您不愿意摆弄链接器选项,您可以随时使用 add glew.c to your project相反。


另一件事:您在 DrawUtils.h 中使用 GLuint,但没有包含 gl.hglew.h :

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

关于c++ - 使用 SDL 和 GLEW 设置 Visual Studio 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28361887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com