首页 > 解决方案 > glxGetCurrentDisplay() 为空 (GLEW)

问题描述

我刚刚切换到 linux mint,我正在尝试使用 opengl 启动并运行它。问题是程序有段错误:

#include <iostream>
#include <vector>

#include "GL/glew.h"
#include "GLFW/glfw3.h"

int main(int, char*[])
{
    GLFWwindow *window = nullptr;

    if(!glfwInit()) {
        std::cout << "Failed glfw" << std::endl;
        return -1;
    }

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);

    window = glfwCreateWindow(1280, 720, "Hey there", nullptr, nullptr);    

    if(window == nullptr) {
        std::cout << "Failed to create window" << std::endl;
        glfwTerminate();
        return -1;  
    }

    glfwMakeContextCurrent(window);

    std::cout << glGetString(GL_VERSION) << std::endl;

    glewExperimental = GL_TRUE;

    if(glewInit() != GLEW_OK) {
        std::cout << "glew failed" << std::endl;
        return -1;
    }

    std::vector<float> positions = {
        -0.5f, -0.5f,
         0.0f,  0.5f,
         0.5f, -0.5f
    };

    unsigned int vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    unsigned int vbo;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, positions.size() * sizeof(float), &positions[0], GL_STATIC_DRAW); 

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), nullptr);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    while(!glfwWindowShouldClose(window) && glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS) {
        glClear(GL_COLOR_BUFFER_BIT);       

        glDrawArrays(GL_TRIANGLES, 0, positions.size() / 2);        

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();

    return 0;
}

在可执行文件上运行 gdb 导致我得出的结论是上下文没有正确创建:

3.3.0 NVIDIA 390.67

Breakpoint 1, main () at /home/alex/Desktop/misc/opengltest/main.cpp:35
35      if(glewInit() != GLEW_OK) {
(gdb) step
glewInit () at /home/alex/Desktop/misc/opengltest/glew-cmake/src/glew.c:18012
18012     r = glewContextInit();
(gdb) n
18013     if ( r != 0 ) return r;
(gdb) n
18022     return glxewInit();
(gdb) step
glxewInit () at /home/alex/Desktop/misc/opengltest/glew-cmake/src/glew.c:17686
17686   {
(gdb) 
17692     display = glXGetCurrentDisplay();
(gdb) step

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()

我的 gpu 是 Nvidia Geforce GT630 和驱动程序:

glxinfo | grep "OpenGL version"
OpenGL version string: 4.6.0 NVIDIA 390.67

我已经搜索了许多关于在 opengl 中创建上下文的线程,但我找不到任何对我有帮助的东西。请注意,该窗口已创建,但紧随其后的是“Segmentation fault (core dumped)”错误。

这是我的 CMakeLists.txt(GLFW 示例运行良好):

cmake_minimum_required( VERSION 3.5 )

project( OpenGLTest )

find_package( OpenGL REQUIRED )

include_directories( ${PROJECT_SOURCE_DIR}/glfw/include/ )

add_subdirectory( ${PROJECT_SOURCE_DIR}/glfw/ )
add_subdirectory( ${PROJECT_SOURCE_DIR}/glew-cmake/build/cmake )

set( SRC_FILES ${PROJECT_SOURCE_DIR}/main.cpp )

add_executable( ogltest ${SRC_FILES} )

target_link_libraries( ogltest ${OPENGL_LIBRARIES} glew_s glfw )

所以问题是:是什么导致了这个问题,我能做些什么呢?

编辑:我真的不习惯 gdb 但这是 bt 命令的正确用法吗?

(gdb) n
35      if(glewInit() != GLEW_OK) {
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt 4
#0  0x0000000000000000 in ?? ()
#1  0x00000000004291f3 in glxewInit () at /home/alex/Desktop/misc/opengltest/glew-cmake/src/glew.c:17692
#2  0x000000000042a075 in glewInit () at /home/alex/Desktop/misc/opengltest/glew-cmake/src/glew.c:18022
#3  0x0000000000404335 in main () at /home/alex/Desktop/misc/opengltest/main.cpp:35

标签: c++openglglfwglew

解决方案


推荐阅读