C++ GDB";无法打开共享对象文件";问题
我已经阅读并遵循了说明 我有一个二进制文件链接到共享库文件(C++ GDB";无法打开共享对象文件";问题,c++,linux,gdb,linker-errors,dynamic-linking,C++,Linux,Gdb,Linker Errors,Dynamic Linking,我已经阅读并遵循了说明 我有一个二进制文件链接到共享库文件(/zzz/yyy/xxx.so)。在我将LD_LIBRARY_PATH设置为/zzz/yyy/并在没有GDB的情况下运行二进制文件之后,它的执行效果非常好 然而,当我试图使用GDB调试这个二进制文件时,GDB说: 加载共享库时出错:xxx.so:无法打开共享对象文件:没有此类文件或目录 我已经有(设置在.gdbinit中): 及 在我的系统中: % printenv LD_LIBRARY_PATH /zzz/yyy GDB仍然找不到这
/zzz/yyy/xxx.so
)。在我将LD_LIBRARY_PATH
设置为/zzz/yyy/
并在没有GDB的情况下运行二进制文件之后,它的执行效果非常好
然而,当我试图使用GDB调试这个二进制文件时,GDB说:
加载共享库时出错:xxx.so:无法打开共享对象文件:没有此类文件或目录
我已经有(设置在.gdbinit中):
及
在我的系统中:
% printenv LD_LIBRARY_PATH
/zzz/yyy
GDB仍然找不到这个共享库的其他可能原因是什么
但是,当我试图使用GDB调试这个二进制文件时,GDB说:加载共享库时出错:xxx.so:无法打开共享对象文件:没有这样的文件或目录
你错了:不是GDB说的,而是动态加载器。GDB本身并不关心LD\u LIBRARY\u PATH
设置为什么,它只是运行您的程序。但您的程序无法运行
最常见的原因是:您在~/.cshrc
中重新设置了LD_库路径
,GDB在单独的shell中运行您的程序,而该shell读取您的.cshrc
,因此您的程序在不正确的环境中执行
修复方法是使非交互式Shell的
.cshrc
未设置LD_LIBRARY_路径
。例如,请参见答案。在这些情况下,它非常有用。尝试运行strace-o out.txt gdb./myprogram
,然后在错误发生后退出调试器并执行grep xxx.so out.txt
查看gdb在哪里查找库。@rodrigo:谢谢。我意识到这是因为我在~/.cshrc中有一个额外的LD_LIBRARY_PATH目录。该目录中有一个x64版本库文件(我的应用程序是为x86构建的)。x64版本文件使GDB抱怨。顺便说一句,strace在本例中似乎工作不好,它没有显示GDB曾经尝试访问x64库(但GDB应该这样做)。可能是GDB分叉了<默认情况下,code>strace只跟踪一个进程。您还可以使用strace-f
跟踪子进程并查看发生了什么。
(gdb) show solib-search-path
The search path for loading non-absolute shared library symbol files is "/zzz/yyy/".
% printenv LD_LIBRARY_PATH
/zzz/yyy