我正在尝试将我的程序链接到libGL.so库,但我的可执行文件最终还是引用了libnvidia-tls.so.331.62和libnvidia-glcore.so.331.62。即使NVidia驱动程序需要执行我的程序(我使用CUDA),我也不希望它依赖于特定版本的库(驱动程序)。
这是一个最小的例子;源:
#include <GL/glew.h>
int main(int argc, char** argv) {
glBegin(GL_LINES);
glEnd();
return 0;
}
我用以下代码构建程序:
g++ -o main main.cpp -lGL
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 main.cpp /usr/lib/x86_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 libs的内容。
编辑:readelf -d main | grep NEEDED
的输出:
0x0000000000000001 (NEEDED) Shared library: [libGL.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
有什么想法吗?谢谢!
答案 0 :(得分:4)
ldd
命令没有按照您的想法执行。
ldd
命令显示程序或库具有的所有库直接和间接依赖关系。因此,它会显示您直接使用的libGL.so.1
和间接使用的libnvidia-tls.so.331.62
。
readelf -d
命令只会显示您的程序直接使用的库:libGL.so.1
和libc.so.6
。
换句话说,libnvidia-tls.so.331.62
的引用不在您的程序中。它位于您的程序使用的库中。如果将程序移动到另一个系统,则可能会看到另一个库。