我对使用openGL的程序有一个奇怪的问题
如果我尝试使用链接选项-pthread -lm -lX11 -lGL -lGLU
我收到错误:
//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
答案 0 :(得分:0)
最终找到了解决方案。
编译可以通过传递-u _nv021glcore -u _nv013glcore
来完成,这会导致失败的操作码。要解决这个问题,还需要使用-- +iglx
来启动,以启用间接渲染,这些渲染似乎默认情况下被禁用,因为它似乎被认为是传统的openGL