gdb说"无法打开共享对象文件"

gra*_*asm 6 c++ linux emacs gdb

我有一个二进制文件和一个共享库.共享库编译为:

all:
g++ -g -shared -fpic $(SOURCES) -o libmisc.so
Run Code Online (Sandbox Code Playgroud)

二进制编译用:

LIBS=-L../../misc/src

LDFLAGS=-lmisc

all:
g++ -g -o mainx $(INCLUDE) $(SOURCE) $(LIBS) $(LDFLAGS)
Run Code Online (Sandbox Code Playgroud)

我开始了 ~/.bashrc

export LD_LIBRARY_PATH=/mnt/sda5/Programming/misc/src/
Run Code Online (Sandbox Code Playgroud)

libmisc.so输出路径.

从控制台调试工作正常:

gdb mainx
Run Code Online (Sandbox Code Playgroud)

但是从Emacs22启动gdb失败,并显示以下消息:

启动程序:/ mnt/sda5 /编程/ main/src/mainx/mnt/sda5 /编程/ main/src/mainx:加载共享库时出错:libmisc.so:无法打开共享对象文件:没有这样的文件或目录

这一刻看起来很棘手,我无法解决它.我不确定这是否是emacs的问题,或者我应该在gdb的命令行中传递一个参数.

Emp*_*ian 6

Emacs不会通过bash调用gdb,而是直接调用它,因此.bashrc更改不会生效LD_LIBRARY_PATH且未设置.

如果你退出emacs,打开一个新的shell(如此LD_LIBRARY_PATH设置),在其中启动emacs,然后执行M-X gdb,然后它就可以了.

solib-search-path在GDB中设置是一个黑客.

更好的解决方法是以不需要LD_LIBRARY_PATH开头的方式构建可执行文件:

LDFLAGS=-lmisc -Wl,-rpath=/mnt/sda5/Programming/misc/src
Run Code Online (Sandbox Code Playgroud)

  • 并非在所有平台上都可用,并且当它出现时,-rpath也存在问题:[rpath(链接)](http://en.wikipedia.org/wiki/Rpath_(linkin))这总是一个权衡. (2认同)

yha*_*ger 5

在调用gdb之前,Emacs可能不会读取.bashrc.尝试将'set solib-search-path'和'set solib-absolute-path设置为.gdbinit文件


Pau*_*aul 5

另一种方法是.gdbinit在你的文件中创建一个文件$HOME并在那里设置LD_LIBRARY_PATH:

# file .gdbinit
set env LD_LIBRARY_PATH=/mnt/sda5/Programming/misc/src/
Run Code Online (Sandbox Code Playgroud)

如果您需要经常使用LD_LIBRARY_PATH进行调试(并且不想记住每次都从shell运行emacs),这很方便.