c++ - 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
解决方案
推荐阅读
- java - 是否可以获得其他活动视图的参考?
- flutter - 在 Flutter 中实现 onTap
- sorting - (快速)在 POSIX sh 中对文件列表进行排序
- python-3.x - 如何在 Python 中将字符串时间戳转换为日期时间对象
- node.js - nsqjs依赖错误:bignumber不是构造函数
- list - Flutter 动态列表,Table 显示意外结果
- powershell - 您不能在空值表达式上调用方法。+ $submitButton.click()
- python - 数据框转换和组合行
- sql - 将行转换为列并使用 group by 求和
- flutter - 为什么即使具有相同的值,这个填充也是不同的?扑