在BSD上链接openGL

时间:2017-11-02 22:32:32

标签: opengl nvidia freebsd

我对使用openGL的程序有一个奇怪的问题

如果我尝试使用链接选项-pthread -lm -lX11 -lGL -lGLU

在带有nvidia图形的FreeBSD计算机上进行编译

我收到错误:

//usr/local/lib/libGL.so: undefined reference to `_nv021glcore'
//usr/local/lib/libGL.so: undefined reference to `_nv013glcore

打开GL演示,在同一台机器上运行正常。如果我尝试使用相同版本的FreeBSD在另一台计算机上编译相同的程序但是没有nvidia板存在,它会编译,但是如果我尝试使用nvidia图形在机器上运行二进制文件,程序将失败

X Error of failed request:  BadValue (integer parameter out of range for operation)
Major opcode of failed request:  153 (GLX)
Minor opcode of failed request:  3 (X_GLXCreateContext)
Value in failed request:  0x0
Serial number of failed request:  22
Current serial number in output stream:  2

OpenGL二进制演示和东西在同一个BSD机器上运行正常,所以GL设置和导致这个编译并在linux上运行的相同程序似乎没有问题,我不知道是什么造成这种情况。

修改

这些nvxxxcore函数中的大多数似乎都是从libnvidia-glcore.so.1导出的 nm -D给出了输出:

00000000010abaa0 T _nv000glcore
00000000010aba90 T _nv001glcore
00000000010abac0 T _nv002glcore
00000000011322e0 T _nv003glcore
00000000010abae0 T _nv014glcore
00000000010d0200 T _nv015glcorea-tls.so which ma
00000000010bc9e0 T _nv016glcore
0000000001c27340 B _nv017glcore
0000000001578ac0 R _nv018glcore
0000000001584480 R _nv019glcore
0000000001c292c0 B _nv020glcore
0000000001c22080 B _nv022glcore
0000000000add970 T _nv023glcore
0000000001c27860 B _nv024glcore
0000000001c292a8 B _nv027glcore
0000000001c2a2a0 B _nv028glcore
0000000001c27178 B _nv029glcore
0000000001bf0248 D _nv035glcore
000000000119ba60 T _nv042glcore

其中不包含这些缺失的链接,但这仍然没有让我更明白如何解决这个问题。

修改

有问题的出口位于libnvidia-tls.so,这使得这一切都变得陌生,因为这应该是从

开始的。
readelf -d /usr/local/lib/libGL.so

Dynamic section at offset 0xf0e08 contains 26 entries:
Tag                Type                  Name/Value
0x0000000000000001 NEEDED               Shared library: [libnvidia-tls.so.1]
0x0000000000000001 NEEDED               Shared library: [libnvidia-glcore.so.1]
0x0000000000000001 NEEDED               Shared library: [libX11.so.6]
0x0000000000000001 NEEDED               Shared library: [libXext.so.6]
0x0000000000000001 NEEDED               Shared library: [libc.so.7]
0x000000000000000e SONAME               Library soname: [libGL.so.1]
0x0000000000000010 SYMBOLIC             0x0

1 个答案:

答案 0 :(得分:0)

最终找到了解决方案。 编译可以通过传递-u _nv021glcore -u _nv013glcore来完成,这会导致失败的操作码。要解决这个问题,还需要使用-- +iglx来启动,以启用间接渲染,这些渲染似乎默认情况下被禁用,因为它似乎被认为是传统的openGL