无法访问的 glXMakeCurrent 使 C++ 应用程序崩溃

Unreachable glXMakeCurrent crashes c++ application

通常我可以自己解决几乎所有的编程问题,但是这个问题真的让我很惊讶,我想你也会觉得它很有趣。

所以我正在使用 GLX 开发低级 OpenGL 应用程序,它因分段错误而崩溃。我已将代码分解为这个最小的示例:

#include <string>
#include <GL/glx.h>

int main(int argc, char** argv)
{
    Display* display = NULL;
    if(display)
        glXMakeCurrent(display, 0, 0);
    std::string title("Hello GLX");
    return 0;
}

我用

编译
g++ -g -o wtf wtf.cpp -lGL

顺便说一句,我使用的是 64 位 Linux Mint 17.3。

如您所见,没有任何可疑之处——我的意思是它甚至什么都没做,但正如我所说,它崩溃了……如果我注释掉 glXMakeCurrent,段错误就会消失绝对没有意义,因为那甚至还没有达到。 如果我删除字符串的实例化,它也不会崩溃。交换实例化或包含没有帮助,它仍然会崩溃。

这是一个 GDB 回溯:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0  0x0000000000000000 in ?? ()
#1  0x00007ffff3deb291 in init () at dlerror.c:177
#2  0x00007ffff3deb6d7 in _dlerror_run (operate=operate@entry=0x7ffff3deb130 <dlsym_doit>, args=args@entry=0x7fffffffdc50)
    at dlerror.c:129
#3  0x00007ffff3deb198 in __dlsym (handle=<optimized out>, name=<optimized out>) at dlsym.c:70
#4  0x00007ffff7b4ee1e in ?? () from /usr/lib/nvidia-352/libGL.so.1
#5  0x00007ffff7af9b47 in ?? () from /usr/lib/nvidia-352/libGL.so.1
#6  0x00007ffff7dea0cd in call_init (l=0x7ffff7ff94c0, argc=argc@entry=1, argv=argv@entry=0x7fffffffdda8, 
    env=env@entry=0x7fffffffddb8) at dl-init.c:64
#7  0x00007ffff7dea1f3 in call_init (env=<optimized out>, argv=<optimized out>, argc=<optimized out>, l=<optimized out>)
    at dl-init.c:36
#8  _dl_init (main_map=0x7ffff7ffe1c8, argc=1, argv=0x7fffffffdda8, env=0x7fffffffddb8) at dl-init.c:126
#9  0x00007ffff7ddb30a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#10 0x0000000000000001 in ?? ()
#11 0x00007fffffffe101 in ?? ()
#12 0x0000000000000000 in ?? ()
(gdb) 

和我的 glxinfo 输出(扩展名除外)

name of display: :0
display: :0  screen: 0
direct rendering: Yes
server glx vendor string: NVIDIA Corporation
server glx version string: 1.4
...
client glx vendor string: NVIDIA Corporation
client glx version string: 1.4
...
GLX version: 1.4
...
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce GTX 560 Ti/PCIe/SSE2
OpenGL core profile version string: 4.3.0 NVIDIA 352.63
OpenGL core profile shading language version string: 4.30 NVIDIA via Cg compiler
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
...
OpenGL version string: 4.5.0 NVIDIA 352.63
OpenGL shading language version string: 4.50 NVIDIA
OpenGL context flags: (none)
OpenGL profile mask: (none)

我对此感到非常惊讶,因为恕我直言,这完全没有意义。你们中有人知道问题出在哪里吗?我在想一些调用可能已经破坏了 类 VTable,但在这个例子中甚至没有 类。它也不是与 libGL.so.

的 32 位与 64 位冲突

当我在 main 函数的开头放置一个 std::cerr << "foo";std::cerr.flush();(虽然不是必需的,但可以确定),我没有得到任何输出,所以它看起来像一个加载库的问题,但我可以 运行 来自 opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX) 的代码,所以问题不是库的发现或者图形芯片处于某种故障状态左右(我什至重新启动了... linux 机器...这就是我的想法!)

的副本 那里的解决方法也适用于我:强制链接 libpthread,例如

export LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0
./wtf

仍然是我遇到过的最奇怪和最不合逻辑的问题之一。