OpenGL 程序无法在 Qt Creator 中启动

Posted

技术标签:

【中文标题】OpenGL 程序无法在 Qt Creator 中启动【英文标题】:OpenGL program doesn't start in Qt Creator 【发布时间】:2012-08-29 19:23:57 【问题描述】:

我在 linux mint 上使用 Qt Creator,并尝试运行 opengl 程序。 该建筑没有给出任何错误,但是当我尝试在 Qt Creator 中运行该程序时,会出现一个终端窗口,并且没有其他任何事情发生。当我直接在终端中运行程序时,我得到以下输出:

OpenGL version supported by this platform (3.3.0 NVIDIA 295.40): 
OpenGL 3.3.0 NVIDIA 295.40, GLSL 3.30 NVIDIA via Cg compiler
Ready for OpenGL 2.0
Segmentation fault (core dumped)

我的代码:

#include <stdio.h>
#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/glext.h>

int main(int argc, char **argv) 

    glutInit(&argc, argv);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(100, 100);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Aquarium");
    glutDisplayFunc(onDisplay);
    glutMouseFunc(onMouse);
    glutIdleFunc(onIdle);
    glutKeyboardFunc(onKeyboard);
    glutReshapeFunc(onReshape);

    printf("OpenGL version supported by this platform (%s): \n", glGetString(GL_VERSION));

    printf("OpenGL %s, GLSL %s\n",glGetString(GL_VERSION),glGetString(GL_SHADING_LANGUAGE_VERSION));

    glewInit();

    if (glewIsSupported("GL_VERSION_2_0"))
        printf("Ready for OpenGL 2.0\n");
    else 
        printf("OpenGL 2.0 not supported\n");
        exit(1);
    

    onInitialization();

    glutMainLoop();

    return 0;

我已经定义了事件处理程序,并且我也有 onInitialization() 方法。 如果我尝试在 onInitialization() 方法的开头打印某些内容,则程序除了我之前编写的行之外不会写任何其他内容。所以它不会进入 onInitialization() 我认为。我什至不能在 Qt Creator 中调试这个程序。什么会导致这种情况?什么会导致我无法在 Qt Creator 中启动程序?我有一个 .pro 文件:

QT       -= gui core

TARGET = main
CONFIG   += console

TEMPLATE = app

LIBS += /usr/lib/libglut.so /usr/lib/compiz/libopengl.so /usr/lib/i386-linux-gnu/libGLU.so /usr/lib/i386-linux-gnu/libGLEW.so

QMAKE_CXXFLAGS += -W -Wall -Wextra -pedantic

SOURCES += main.cpp

使用相同的设置,我已经能够在 Windows 下运行程序(当然那里的 LIBS 是不同的)。

onInitialization():

void onInitialization( ) 

    printf("onInitialization");

   soft.controlpoints.push_back(Point(5., 5., 5.));
   soft.speeds.push_back(Point(0., 0., 0.));
   soft.controlpoints.push_back(Point(5, -5., 5.));
   soft.speeds.push_back(Point(0., 0., 0.));
   soft.controlpoints.push_back(Point(5., -5., -5.));
   soft.speeds.push_back(Point(0., 0., 0.));

   soft2.controlpoints.push_back(Point(5., 5., 5.));
   soft2.speeds.push_back(Point(0., 0., 0.));
   soft2.controlpoints.push_back(Point(5, -5., 5.));
   soft2.speeds.push_back(Point(0., 0., 0.));
   soft2.controlpoints.push_back(Point(5., -5., -5.));
   soft2.speeds.push_back(Point(0., 0., 0.));
   soft2.controlpoints.push_back(Point(-5., 5., -5.));
   soft2.speeds.push_back(Point(0., 0., 0.));

   soft.set_r();
   soft2.set_r();

   aquarium.objects.push_back(&water);
   aquarium.objects.push_back(&fish);
   aquarium.objects.push_back(&field);
   aquarium.objects.push_back(&soft2);

   aquarium.createMaterials();

   aquarium.createVoxelArray();

   glEnable(GL_DEPTH_TEST);
   lastMovingTime = 0.;

   setShadowMapShaders();
   setAquariumShaders();

它甚至不打印“onInitialization”字符串。方法中的对象是全局变量,这里调用的所有方法都实现了。什么会导致它不打印“onInitialization”字符串? soft.controlpoints、soft.speeds 和 aquarium.object 是公共字段。即使我评论其他所有内容,字符串也不会出现,但会创建窗口。而且它仍然没有从 Qt Creator 内部运行。

【问题讨论】:

你为什么不检查glewInit()的返回码? 显然问题出在onInitialization 函数的某个地方。请发布那个代码,以便我们为您提供帮助。 经过一番调试,问题似乎出在 glShaderSource() 方法上。 【参考方案1】:

原来问题出在文件读取器方法(读取 GLSL 着色器代码)上,这是因为 Qt Creator 的工作目录未设置在包含着色器源文件的目录中。

【讨论】:

以上是关于OpenGL 程序无法在 Qt Creator 中启动的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac osx 下将 OpenGL 链接到 Qt Creator

从 Qt creator 访问 Modern OpenGL 函数

Qt Creator 中的 Glew 链接问题?

Cmake 无法在 qt creator/collect2 上编译简单的测试程序:错误:ld

无法在 Qt Creator 中启动 gdb.exe

Qt Creator 版本之间有啥区别?