我尝试用gdb调试程序,在运行命令后我得到错误(在gdb内)
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found
我确保LD_LIBRARY_PATH已设置,即 set env LD_LIBRARY_PATH ,因为它在调用shell中,如果启动该程序,则不会出现此错误消息 .
set env LD_LIBRARY_PATH
这个错误是由于没有安装libc的调试版本吗?
是否由于未安装libc的调试版本而导致此错误
没有 .
您没有使用 libc++ ,您使用的是 libstdc++ ,这完全不同 . 该问题与 libstdc++ 的调试版本无关 .
libc++
libstdc++
问题是双重的:
您正在使用比系统上安装的更新版本的GCC构建二进制文件,这需要您设置 LD_LIBRARY_PATH
LD_LIBRARY_PATH
您有 ~/.bashrc 或 ~/.cshrc 或 ~/.zshrc ,它会重置 LD_LIBRARY_PATH . 这可以防止GDB运行您的二进制文件,因为gdb run 命令实际上是 $SHELL /path/to/binary <args> ,并且由于您的shell重置 LD_LIBRARY_PATH ,所以当您的二进制文件运行时, LD_LIBRARY_PATH 已经不正确 .
~/.bashrc
~/.cshrc
~/.zshrc
run
$SHELL /path/to/binary <args>
通常最好构建二进制文件,使其首先不需要设置 LD_LIBRARY_PATH . 这是通过将 -Wl,-rpath=/path/to/directory-containing-correct-libstdc++.so.6 添加到您的链接行来实现的 .
-Wl,-rpath=/path/to/directory-containing-correct-libstdc++.so.6
这解决了问题#1,并允许您使用GDB调试二进制文件 .
您还应该更改 ~/.bashrc ,使其对非交互式shell不执行任何操作 . 这个document展示了如何实现这一目标 .
1 回答
没有 .
您没有使用
libc++
,您使用的是libstdc++
,这完全不同 . 该问题与libstdc++
的调试版本无关 .问题是双重的:
您正在使用比系统上安装的更新版本的GCC构建二进制文件,这需要您设置
LD_LIBRARY_PATH
您有
~/.bashrc
或~/.cshrc
或~/.zshrc
,它会重置LD_LIBRARY_PATH
. 这可以防止GDB运行您的二进制文件,因为gdbrun
命令实际上是$SHELL /path/to/binary <args>
,并且由于您的shell重置LD_LIBRARY_PATH
,所以当您的二进制文件运行时,LD_LIBRARY_PATH
已经不正确 .通常最好构建二进制文件,使其首先不需要设置
LD_LIBRARY_PATH
. 这是通过将-Wl,-rpath=/path/to/directory-containing-correct-libstdc++.so.6
添加到您的链接行来实现的 .这解决了问题#1,并允许您使用GDB调试二进制文件 .
您还应该更改
~/.bashrc
,使其对非交互式shell不执行任何操作 . 这个document展示了如何实现这一目标 .