2016-03-26 6 views
0

私は動的ライブラリlibexample.soを使ってプログラムを作成します。動的ライブラリは別の動的ライブラリlibtool.soに依存します。別のダイナミックライブラリに応じてダイナミックライブラリをリンクするにはどうすればよいですか?

gccからのメッセージのためにlibexample.soをリンクするのにリンカに見えました。

Building target: libexample.so 
Invoking: GCC C++ Linker 
g++ -L/home/takehiro/Documents/documents/code/lib/tool -shared -o "libexample.so" ./classes/example.o ./classes/example_template.o ./classes/example_test.o ./classes/impl.o -ltool 
Finished building target: libexample.so 

cp libexample.so /home/takehiro/Documents/documents/code/lib/example 

ただし、libtool.soとのリンクに失敗しました。

ldd /home/takehiro/Documents/documents/code/lib/example/libexample.so 
    ... 
    libtool.so => not found 
    ... 

は私が

ls /home/takehiro/Documents/documents/code/lib/tool 

libtool.so 

これがあることで、リンカ上記で-L optoinによって指される/ホーム/武宏/ドキュメント/文書/コード/ libに/ツールの下libtool.soの存在を確認しました別の動的ライブラリに応じてダイナミックライブラリを使用するのは初めてです。だから私はとても混乱している。それは正常か機能不全ですか?なぜそれらをリンクできないのですか? 誰かに私に提案や解決策がありますか?私はとても嬉しいです。 ありがとうございます。

答えて

2

-Lオプションはリンク時に共有ライブラリがどこにあるかをリンカに伝えます。

これは、ランタイムローダーが共有ライブラリを検索する場所には影響しません。そのため、共有ライブラリは実行時にロードされません。

RPATH属性を共有ライブラリに設定するために、共有ライブラリをリンクするときに、その依存関係を検索する場所を指定するために、-rpathオプションをリンカーに渡す必要があります。何かのように

g++ -L/home/takehiro/Documents/documents/code/lib/tool \ 
    -Wl,-rpath=/home/takehiro/Documents/documents/code/lib/tool \ 
    ... remaining options 
+0

ありがとうSam Varshavchikに感謝します。私は以下のことを確認させてください。実行ファイルの場合、LD_LIBRARY_PATHを使用してライブラリの場所を知ることができます。ただし、別の共有ライブラリに依存する共有ライブラリの場合、LD_LIBRARY_PATHは使用されません。そうですか? – mora

+1

ですが、 '-rpath'を使用すると、LD_LIBRARY_PATHを明示的に使用できなくなります。 –

+0

Sam Varshavchik、もう一度ありがとうございます。私は日食を通してLD_LIBRARY_PATHを使用しました。一時的なLD_LIBRAY_PATHです。これは、実行プログラムが共有ライブラリ内の関数の参照を見つけることができなかった理由かもしれません。とにかく-rpathを使います。どうもありがとうございました。 – mora

関連する問題