我试图把我的程序链接到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; }
我用以下方法构build程序:
g++ -o main main.cpp -lGL
ldd main输出:
_do_fork()如何返回两个不同的PID(一个用于父进程,一个用于subprocess)
Windows C ++进程与线程
无法在gdb中设置断点
如何find代码来炸毁我的应用程序的大小?
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编译,则得到相同的结果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 readelf -d main | grep NEEDED :
0x0000000000000001 (NEEDED) Shared library: [libGL.so.1] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
有任何想法吗 ? 谢谢 !
检查VirtualAddress是否由VirtualAlloc返回
奇怪的改变状态代码
Linux和Windows套接字API
奇怪! linux&windows vsprintf将num浮点到文件
WindowStyle =“None”的最大化窗口不会再次使用键盘SHIFT + WIN + LEFT / RIGHT移动
ldd命令不会做你认为的事情。
ldd命令向您显示程序或库所具有的所有库依赖项,包括直接和间接库。 所以它会显示你直接使用libnvidia-tls.so.331.62和间接使用的libnvidia-tls.so.331.62 。
readelf -d命令将只显示您的程序直接使用的库: libGL.so.1和libc.so.6 。
换句话说,对libnvidia-tls.so.331.62的引用不在你的程序中。 它在你的程序使用的库中。 如果将程序移动到另一个系统,则可能会看到另一个库。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。