0

次のメイクファイルがあります

FLAGS = -g -c -Wall -Wextra -O2 -pedantic -Werror
CC = g++
SOURCE = $(wildcard src/*.cpp)
INTERM = $(patsubst %.cpp,%.o,$(SOURCE))
OBJECTS = $(patsubst src/%,nbobj/%,$(INTERM))
RES = app
INCLUDE = -I../../libs
OPENCV = -L/usr/local/lib `pkg-config --cflags --libs opencv`
LINK =  -L./../../libs -lgstd  $(OPENCV)


$(RES): $(OBJECTS)
    $(CC) $(OBJECTS) -o $(RES) $(LINK)

nbobj/%.o: src/%.cpp 
    $(CC) $(FLAGS) $(INCLUDE) -o $@ -c $<

clean:
    rm -rf $(RES) $(OBJECTS) 

正常にコンパイルされますが、プログラムを実行すると

共有ライブラリの読み込み中にエラーが発生しました: libgstd.so: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません

これにより、いくつかの質問が発生します。

  • libgstd はコンパイル時に明らかに検出され (-lgstd を削除すると、プログラムはコンパイルされません)、プログラムを実行しても .so は移動しませんでした。突然見つからなくなったのはどうしてですか?
  • ld.conf を変更する必要があるという多くの投稿を読みました。-L フラグのポイントは、それを正確に回避することだと思いました。私が書いた小さなライブラリのシステムファイルを変更したくありません。また、システムファイルをいじってlibgstdを「インストール」することを誰かに強制することなく、実行可能ファイルとlibgstdを1つのフォルダーにまとめて出荷したい
  • -R フラグは実行時の -L と同等であることも読みましたが、-R でコンパイルすると、コンパイラは「エラー: 認識されないオプション '-R'」と表示します。

さらに、「clock_gettime」への呼び出しを含むライブラリがある場合、同様の問題が発生しています。正常にコンパイルされますが、実行時にそのライブラリの関数を使用すると、「「clock_gettime」への未定義の参照」が発生します。ライブラリをコンパイルしたときにリンカが clock_gettime を見つけたように見えるのに、ライブラリを使用するとファイルが移動されていないのに見つからなかったのはなぜですか?

手伝ってくれてどうもありがとう :)

4

1 に答える 1

3

プログラムの起動中に、OS はロードするライブラリを見つけることができません。特に、./../../libs は検索するパスではないため、どこを検索するかさえわかりません。2 つのことができます。最初に、lib を検索するフォルダーに移動します (システムによって異なります)。

/lib/ または /lib64/ または /usr/lib または ...

または2番目に検索する場所をOSに表示します

export LD_LIBRARY_PATH=/absolut/path/to/libs

パラメータ-Lは、リンカへのリンク時に検索する追加のパスを指定します。OSへの実行中はありません。-lは、リンカーの追加ライブラリを指定します。

于 2013-11-14T19:43:44.123 に答える