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