【问题标题】:Linking to libGL adds references to NVidia libraries链接到 libGL 添加对 NVidia 库的引用
【发布时间】:2014-08-29 02:15:04
【问题描述】:

我正在尝试将我的程序链接到 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 库的内容。

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

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

有什么想法吗?谢谢!

【问题讨论】:

  • readelf -d t main | grep NEEDED 的输出是什么? (
  • 我将它添加到问题中:-)

标签: c linux opengl nvidia dynamic-linking


【解决方案1】:

ldd 命令并没有按照您的想法执行。

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

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

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

【讨论】:

  • 这意味着我的程序很可能已经与使用不同版本的 nvidia 驱动程序的系统兼容,而且我实际上一开始就没有任何问题?谢谢 ! (注意:我认为你的意思是 readelf -d -t,使用 readelf -d t 会给我“t:没有这样的文件”)
  • "readelf -d t main" 给我“readelf: Error: 't': No such file”,然后是“File: main”,然后是与 readelf -d main 相同的结果
  • @personne3000:你说得对,t 不属于那里。
猜你喜欢
  • 2012-06-06
  • 2013-01-13
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
相关资源
最近更新 更多