6


2

gdbによる「共有オブジェクトファイルを開けない」

私は1つのバイナリライブラリと1つの共有ライブラリを持っています。 共有ライブラリは次のようにコンパイルされています。

all:
g++ -g -shared -fpic $(SOURCES) -o libmisc.so

バイナリは次のようにコンパイルされています。

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

LDFLAGS=-lmisc

all:
g++ -g -o mainx $(INCLUDE) $(SOURCE) $(LIBS) $(LDFLAGS)

`+〜/ .bashrc +`に設定します

export LD_LIBRARY_PATH=/mnt/sda5/Programming/misc/src/

`+ libmisc.so +`出力パスへ。

コンソールからのデバッグはうまく機能します。

gdb mainx

しかしEmacs 22から、gdbの起動は次のメッセージで失敗します。

_ 開始プログラム:/ mnt / sda5 / Programming / main / src / mainx / mnt / sda5 / Programming / main / src / mainx:共有ライブラリのロード中にエラーが発生しました:libmisc.so:共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません _

現時点ではこれは非常に注意が必要ですが、私はそれを解決できませんでした。 これがemacsの問題なのか、それともgdbのコマンドラインでパラメータを渡すべきなのか私にはわかりません。

3 Answer


6


Emacsはbashを介してgdbを起動するのではなく、直接起動するため、.bashrcの変更は有効にならず、 `+ LD_LIBRARY_PATH +`は設定されません。

emacsを終了した場合、新しいシェルを開き(そのため `+ LD_LIBRARY_PATH `が設定されます)、その中でemacsを起動してから、 ` M-X gdb +`を実行すると動作します。

GDBで `+ solib-search-path +`を設定するのはハックです。

より良い修正方法は、最初に `+ LD_LIBRARY_PATH +`を必要としない方法で実行可能ファイルをビルドすることです:

LDFLAGS=-lmisc -Wl,-rpath=/mnt/sda5/Programming/misc/src


5


Emacsはおそらくgdbを起動する前にあなたの.bashrcを読み込まないでしょう。 あなたの中に 'set solib-search-path’と 'set solib-absolute-pathを入れてみてください。 .gdbinit file instead


5


別の方法は、 + $ HOME`に + .gdbinit`ファイルを作成し、そこにLD_LIBRARY_PATHを設定することです:

# file .gdbinit
set env LD_LIBRARY_PATH=/mnt/sda5/Programming/misc/src/

あなたが頻繁にそのLD_LIBRARY_PATHでデバッグする必要があるなら(そして毎回あなたのシェルからemacsを実行することを忘れたくない)これは便利です。