5

C++ Linux プロジェクトの Makefile があります。

MODE ?= dbg
DIR = ../../../../../somdir/$(MODE)

SRC_FILES = a.cpp b.cpp
H_FILES = a.h

LDFLAGS += -L$(DIR)/lib/linux '-Wl,-R$$ORIGIN'
CPPFLAGS = -I$(DIR)/include
LIBRARIES = -lsomeso

ifeq (rel, $(MODE))
  CFLAGS = -Wall -g -DNDEBUG
else
  CFLAGS = -Wall -ansi -pedantic -Wconversion -g -DDEBUG -D_DEBUG
endif

sample: $(SRC_FILES) $(H_FILES) Makefile
    g++ $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(LIBRARIES) $(SRC_FILES) -o sample

「make」を実行すると、エラーなしでプロジェクトがビルドされます。しかし、プロジェクトを実行すると、次のように不平を言います:

error while loading shared libraries: libsomeso.so: cannot open shared object file: No such file or directory

DIR で指定したパスは、共有オブジェクトが保持されているフォルダー (makefile が配置されている場所と比較して) に移動します。パスが間違っていた場合、make プロセス中に文句を言わなかったのはなぜですか。

誰かが私が欠けているものを知っていますか?

ありがとうマット

4

5 に答える 5

5
LDFLAGS += -L$(DIR)/lib/linux '-Wl,-R$$ORIGIN'

上記は次のようになります。

LDFLAGS += -L$(DIR)/lib/linux -Wl,-R$(DIR)/lib/linux '-Wl,-R$$ORIGIN'

つまり、非標準のダイナミックライブラリの場所ごとに-L、対応-Wl,-Rするものを指定する必要があります。$ORIGIN実行可能ファイルに関連するダイナミックライブラリを見つけるために必要ですが、ここで必要かどうかはわかりません。

人々はしばしばを使用することを勧めLD_LIBRARY_PATHます。これは、展開がより複雑になるため、私の意見では悪いアドバイスです。

于 2013-02-25T10:56:45.233 に答える
2

アプリケーションを実行するとき、の場所は環境変数にあるlibsomeso.so必要があります。LD_LIBRARY_PATH次のようにプログラムを実行してみてください。

LD_LIBRARY_PATH="path_to_libsomeso_so:$LD_LIBRARY_PATH" myprogram

が配置されているディレクトリpath_to_libsomeso_soのフル パスは、プログラムの実行可能ファイルです。ファイル自体ではなく、を含むディレクトリへのパスを指定する必要があることに注意してください。libsomeso.somyprogramlibsomeso.solibsomeso.so

于 2013-02-25T10:29:44.167 に答える
1

問題はコンパイル時ではありません。すべてうまくいきます。実行時に問題があります。

実際、プログラムは共有オブジェクトライブラリにリンクされています。したがって、実行時に、この共有オブジェクトファイルをロードする必要があります。コンパイル中に、このファイルが-Lフラグ付きの場所にあることをコンパイラーに指示します。

ランタイムの場合LD_LIBRARY_PATH、ファイルが存在するディレクトリを指すように環境変数を設定する必要がありlibsomeso.soます。

または、このファイルを、これらの共有オブジェクトファイルが検索される標準ディレクトリの1つに配置することもできます:、、、/usr/local/lib。ただし/usr/lib/libこれは、ライブラリの最終的な分散バージョンに対して行うことです。

于 2013-02-25T10:32:00.850 に答える
1

Maxim Egorushkin から言われたように、それLD_LIBRARY_PATHは悪い選択です。一方、-L$(your lib path) -l$(your lib name)gcc/g++ 引数を使用して共有ライブラリをリンクするのは適切な選択ではありません。exe をビルドした後、共有ライブラリ ディレクトリの場所を exe に伝える必要があるためです。デフォルトでは、実行可能ファイルは/usr/libまたはの共有ライブラリのみを検索します/usr/local/lib。ただし、実行可能ファイルをビルドするときに共有ライブラリがどこにあるかを makefile に伝えました。しかし、このexeファイルを実行すると、それらは異なります。しかし、リンクスタティックライブラリにはそのような問題はありません。

したがって、問題に対処する最善の方法は、カスタム共有ファイルをリンクする方法を変更することです。このような:

DYNAMIC_LIB_DIR = ../lib (your lib path ,this is a example)

OBJLIBS = xxx.so (your lib name)

gcc/g++ -o exe_name sourcefile/object_file $(DYNAMIC_LIB_DIR)/$(OBJLIBS)
于 2016-07-26T12:36:04.457 に答える