从静态编译的代码调用时,GLX窗口创建工作,但从共享库崩溃

时间:2014-10-01 07:17:55

标签: linux opengl x11 glx

我正试图剥离一些GLX窗口/上下文创建代码 静态编译的二进制文件和共享库。相同的代码 在共享库版本的静态版本崩溃中工作正常 第一次调用任何glX - 前缀函数。作为一个最小的 (非)工作示例,这里是miniglx.cpp

#include <stdio.h>
#include <stdlib.h>
#include <GL/glx.h>

extern "C"{
  void print_glx_version();
  int main(int argc, char* argv[]);
}

void print_glx_version()
{
  const char displayID[] = ":0.0";

  Display *display = XOpenDisplay(displayID);

  if (!display)
  {
    printf("Failed to open X display\n");
  }

  int glx_major, glx_minor;

  int res = glXQueryVersion(display, &glx_major, &glx_minor);
  {
    printf("glX version %d.%d\n", glx_major, glx_minor);
  }
}

int main(int argc, char* argv[]){
  print_glx_version();
  exit(0);
}

当我编译为可执行文件时

g++ -o miniglx miniglx.cpp -lGL -lX11

并运行./miniglx,按预期打印glX version 1.4

但是,当我编译为共享库时

g++ -fPIC -shared -o libminiglx.so src/miniglx.cpp -lGL -lX11

并尝试dlopen在另一个程序中调用它 print_glx_version,它崩溃了。在gdb中运行表明崩溃 发生在glXQueryVersion的调用中并打印消息

Program received signal SIGABRT, Aborted.
[Switching to Thread 0x7fffecdf6700 (LWP 8774)]
0x00007ffff69a6bb9 in __GI_raise (sig=sig@entry=6)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.

共享lib编译并链接正常,ldd显示它似乎 链接到libGL.solibX11.so

bash$ ldd libminiglx.so
linux-vdso.so.1 =>  (0x00007ffff774f000)
libGL.so.1 => /usr/lib/nvidia-340/libGL.so.1 (0x00007f94c835a000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f94c8025000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f94c7c5e000)
libnvidia-tls.so.340.32 => /usr/lib/nvidia-340/tls/libnvidia-tls.so.340.32 (0x00007f94c7a5b000)
libnvidia-glcore.so.340.32 => /usr/lib/nvidia-340/libnvidia-glcore.so.340.32 (0x00007f94c4e48000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f94c4c35000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f94c4a31000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f94c4812000)
/lib64/ld-linux-x86-64.so.2 (0x00007f94c88c4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f94c450b000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f94c4307000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f94c4101000)

两种情况之间可能存在的一个区别(静态vs 动态)是在静态lib的情况下,我不是dlopen lib 主线程(我无法控制)。有问题吗? 在其他线程上执行glX窗口/上下文管理?

我使用的是Ubuntu 14.04 LTS,带有NVIDIA Corporation GT200GL [Quadro FX 5800] (rev a1) GPU。台面上都存在这种行为 和nvidia显卡驱动程序。 glxinfo | head返回

name of display: :0
display: :0  screen: 0
direct rendering: Yes
server glx vendor string: NVIDIA Corporation
server glx version string: 1.4
server glx extensions:
    GLX_ARB_create_context, GLX_ARB_create_context_profile, 
    GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float, 
    GLX_ARB_multisample, GLX_EXT_buffer_age, 
    GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile, 

0 个答案:

没有答案