C 链接到libGL会添加对NVidia库的引用

C 链接到libGL会添加对NVidia库的引用,c,linux,opengl,nvidia,dynamic-linking,C,Linux,Opengl,Nvidia,Dynamic Linking,我试图将我的程序链接到libGL.so库,但我的可执行文件最后也引用了libnvidia-tls.so.331.62和libnvidia-glcore.so.331.62。尽管英伟达驱动程序将被要求执行我的程序(我使用CUDA),但我不希望它依赖于特定版本的库(驱动程序)。 这里是一个最小的例子;资料来源: #include <GL/glew.h> int main(int argc, char** argv) { glBegin(GL_LINES); glEnd(

我试图将我的程序链接到libGL.so库,但我的可执行文件最后也引用了libnvidia-tls.so.331.62和libnvidia-glcore.so.331.62。尽管英伟达驱动程序将被要求执行我的程序(我使用CUDA),但我不希望它依赖于特定版本的库(驱动程序)。 这里是一个最小的例子;资料来源:

#include <GL/glew.h>

int main(int argc, char** argv) {
    glBegin(GL_LINES);
    glEnd();

    return 0;
}
ldd main的输出

linux-vdso.so.1 =>  (0x00007fff6c3fc000)
libGL.so.1 => /usr/lib/nvidia-331/libGL.so.1 (0x00007fd4f37c5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd4f33fd000)
libnvidia-tls.so.331.62 => /usr/lib/nvidia-331/tls/libnvidia-tls.so.331.62 (0x00007fd4f31f9000)
libnvidia-glcore.so.331.62 => /usr/lib/nvidia-331/libnvidia-glcore.so.331.62 (0x00007fd4f09ea000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fd4f06b5000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fd4f04a2000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd4f029e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd4f3b21000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd4eff9a000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fd4efd7b000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fd4efb77000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fd4ef971000)
(请注意对libnvidia tls和libnvidia glcore的引用)

如果我使用
g++-o main.cpp/usr/lib/x86\u 64-linux-gnu/libGL.so
编译,我会得到相同的结果

ldd/usr/lib/x86_64-linux-gnu/libGL.so的输出

linux-vdso.so.1 =>  (0x00007fff4d5d8000)
libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007fa63dfd5000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fa63ddc3000)
libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007fa63dbbf000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007fa63d9b9000)
libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007fa63d7b7000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fa63d481000)
libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007fa63d26a000)
libxcb-dri2.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-dri2.so.0 (0x00007fa63d065000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fa63ce46000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007fa63cc40000)
libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007fa63ca34000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa63c816000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa63c612000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa63c24a000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fa63c045000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fa63be3f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa63e482000)
请注意,这里没有关于nvidia LIB的内容

编辑:需要的
readelf-d main | grep的输出

0x0000000000000001 (NEEDED)             Shared library: [libGL.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

有什么想法吗?谢谢

ldd命令的作用与您认为的不同


ldd
命令显示程序或库具有的所有库依赖项,包括直接依赖项和间接依赖项。因此,它将显示您直接使用的
libGL.So.1
,以及您间接使用的
libnvidia tls.So.331.62

readelf-d
命令将仅显示程序直接使用的库:
libGL.so.1
libc.so.6


换句话说,对libnvidia tls.so.331.62的引用不在程序中。它位于程序使用的库中。如果您将程序移动到另一个系统,您可能会看到另一个库在它的位置。

需要的
readelf-dtmain | grep的输出是什么
?(我把它添加到问题:-)这意味着我的程序最可能已经与使用英伟达驱动程序的不同版本的系统兼容,而实际上我没有任何问题吗?谢谢(注意:我想你的意思是readelf-d-t,使用readelf-dt会给我“t:没有这样的文件”)“readelf-dtmain”会给我“readelf:Error:'t:没有这样的文件”,然后是“file:main”,然后是与readelf-d相同的结果main@personne3000:你说得对,
t
不属于那里。
0x0000000000000001 (NEEDED)             Shared library: [libGL.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]