在带有openGL和SDL的Linux上使用c ++时出现SIGSEGV错误

Posted

技术标签:

【中文标题】在带有openGL和SDL的Linux上使用c ++时出现SIGSEGV错误【英文标题】:SIGSEGV error while using c++ on linux with openGL and SDL 【发布时间】:2012-01-24 05:37:18 【问题描述】:

我和其他几个人正在尝试构建一个简单的横向卷轴类型的游戏。但是,我无法让他们帮助回答我的问题,所以我把它给你,下面的代码在标记的地方给我留下了一个 SIGSEGV 错误......如果有人能告诉我为什么,我真的很感激.如果您需要更多信息,我会密切关注。

Main.cpp

Vector2 dudeDim(60,60);
Vector2 dudePos(300, 300);
Entity *test = new Entity("img/images.jpg", dudeDim, dudePos, false);

导致:

Entity.cpp

Entity::Entity(std::string filename, Vector2 size, Vector2 position, bool passable):
mTexture(filename)

    mTexture.load(false);
    mDimension2D = size;

    mPosition2D = position;

    mPassable = passable;

导致:

纹理.cpp

void Texture::load(bool generateMipmaps)

    FREE_IMAGE_FORMAT imgFormat = FIF_UNKNOWN;

    FIBITMAP *dib(0);

    imgFormat = FreeImage_GetFileType(mFilename.c_str(), 0);

//std::cout << "File format: " << imgFormat << std::endl;

if (FreeImage_FIFSupportsReading(imgFormat)) // Check if the plugin has reading capabilities and load the file
    dib = FreeImage_Load(imgFormat, mFilename.c_str());
if (!dib)
    std::cout << "Error loading texture files!" << std::endl;

BYTE* bDataPointer = FreeImage_GetBits(dib); // Retrieve the image data

mWidth = FreeImage_GetWidth(dib); // Get the image width and height
mHeight = FreeImage_GetHeight(dib);
mBitsPerPixel = FreeImage_GetBPP(dib);

if (!bDataPointer || !mWidth || !mHeight)
    std::cout << "Error loading texture files!" << std::endl;

// Generate and bind ID for this texture

vvvvvvvvvv!!!这里有错误!!!vvvvvvvvvvv

glGenTextures(1, &mId);

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

glBindTexture(GL_TEXTURE_2D, mId); 

int format = mBitsPerPixel == 24 ? GL_BGR_EXT : mBitsPerPixel == 8 ? GL_LUMINANCE : 0; 
int iInternalFormat = mBitsPerPixel == 24 ? GL_RGB : GL_DEPTH_COMPONENT;  

if(generateMipmaps)
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, mWidth, mHeight, 0, format, GL_UNSIGNED_BYTE, bDataPointer); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering

//std::cout << "texture generated " << mId << std::endl;
FreeImage_Unload(dib);

在阅读了 Peter 的建议后,我将 main.cpp 文件更改为:

#include <iostream>
#include <vector>

#include "Game.h"

using namespace std;


int main(int argc, char** argv)


Game theGame;

/* Initialize game control objects and resources */
if (theGame.onInit() != false)

    return theGame.onExecute();

else

    return -1;


似乎 SIGSEGV 错误消失了,我现在留下了一些未初始化的东西。所以谢谢你,彼得你是对的,现在我要解决这个问题了。

好的,这显然是一小部分代码,但为了节省时间和一点理智:所有代码都可以在:

GitHub Repo

【问题讨论】:

&amp;mId 的值是多少?问题似乎是您将错误的地址传递给glGenTextures()。例如,如果您的 this 指针搞砸了,那么 mId 可能是一块随机的内存。 您确定在调用 API 之前已打开 OpenGL 上下文吗? 对不起,彼得,但您所说的“打开 OpenGL 上下文”是什么意思?纹理文件也是我小组的另一位成员编写的,所以我不完全确定它是 100%,但我似乎是唯一一个有问题的人...... 【参考方案1】:

所以在查看了您的代码之后,我可以说您可能在执行该代码之前还没有初始化您的 OpenGL 上下文。

在调用 OpenGL 之前,您需要调用 Game::onInit(),它也调用 RenderEngine::initGraphics()。你目前不这样做。你目前做main()-&gt;Game ctor (calls rendering engine ctor but that ctor doesn't init SDL and OpenGL)-&gt;Entity ctor-&gt;load texture

详情请看OpenGL Wiki FAQ

【讨论】:

以上是关于在带有openGL和SDL的Linux上使用c ++时出现SIGSEGV错误的主要内容,如果未能解决你的问题,请参考以下文章

SDL+OpenGL 程序没有出现在 linux 上

Linux 上的 SDL OpenGL 新手,这有啥问题?

如何让 OpenGL-ES 在带有 SDL2 的 Raspberry Pi 上工作?

C++ - SDL/OpenGL 加载图像的颜色被反转

在 SDL 1.2 中使用核心 OpenGL?

带有 SDL 和 GLEW 的 OpenGL,错误:48