3

私はPOCOプロジェクトサイトのファーストステップチュートリアルで作業しており、ホームディレクトリの下にライブラリ(Debian Linux、2.6.26、gcc 4.3.2)を正常に構築しました。

〜/開発/ POCO

にある共有ライブラリを使用

〜/ Development / POCO / lib / Linux / x86_64 / lib

私の問題は、これらのライブラリに依存するアプリケーションを構築すると、共有ライブラリディレクトリからしか実行できないことです。

〜/ Development / POCO / lib / Linux / x86_64 $ ldd〜/ Development / Cloud / DateTimeSample / bin / Linux / x86_64 / DateTime
        linux-vdso.so.1 =>(0x00007fffe69fe000)
        libPocoFoundation.so.6(0x00007fa8de44f000)
        libpthread.so.0 => /lib/libpthread.so.0(0x00007fa8de233000)
        libdl.so.2 => /lib/libdl.so.2(0x00007fa8de02f000)
        librt.so.1 => /lib/librt.so.1(0x00007fa8dde26000)
        libstdc++。so.6=>/usr/lib/libstdc++.so.6(0x00007fa8ddb1a000)
        libm.so.6 => /lib/libm.so.6(0x00007fa8dd897000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1(0x00007fa8dd680000)
        libc.so.6 => /lib/libc.so.6(0x00007fa8dd32d000)
        /lib64/ld-linux-x86-64.so.2(0x00007fa8de7e0000)

また、このディレクトリからDateTimeを実行すると、期待どおりに機能します。でも

〜/ Development / Cloud / DateTimeSample / bin / Linux / x86_64 $ ldd DateTime
        linux-vdso.so.1 =>(0x00007fff24dfe000)
        libPocoFoundation.so.6=>見つかりません
        libpthread.so.0 => /lib/libpthread.so.0(0x00007ffc1c7dd000)
        libdl.so.2 => /lib/libdl.so.2(0x00007ffc1c5d9000)
        librt.so.1 => /lib/librt.so.1(0x00007ffc1c3d0000)
        libstdc++。so.6=>/usr/lib/libstdc++.so.6(0x00007ffc1c0c4000)
        libm.so.6 => /lib/libm.so.6(0x00007ffc1be41000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1(0x00007ffc1bc2a000)
        libc.so.6 => /lib/libc.so.6(0x00007ffc1b8d7000)
        /lib64/ld-linux-x86-64.so.2(0x00007ffc1c9f9000)

したがって、他のディレクトリから実行可能ファイルを実行すると、

共有ライブラリのロード中にエラーが発生しました:libPocoFoundation.so.6:共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません

makeプロセスからの出力を見ると、ディレクトリが正しく指定されています

g ++ [blah] -L / home / npalko / Development / POCO / lib / Linux / x86_64
           -lPocoFoundation

設定してみました

LD_LIBRARY_PATH
/ home / npalko / Development / POCO / lib / Linux / x86_64
、しかしそれは何も変わっていません。どんな助けでも大歓迎です!

4

3 に答える 3

8

変数を処理する必要がない場合は、gccコマンドラインにLD_LIBRARY_PATHリンカーオプションを追加できます。-rpathあなたの場合、これは次のようになります。

gcc ... -Wl,-rpath=/home/npalko/Development/POCO/lib/Linux/x86_64

これにより、実行可能ファイル内のそのパスが効果的にハードコードされるため、目的に適している場合とそうでない場合があります。

于 2009-09-26T00:05:40.263 に答える
2

これは失敗しますか?

LD_LIBRARY_PATH=/home/npalko/Development/POCO/lib/Linux/x86_64 ~/Development/Cloud/DateTimeSample/bin/Linux/x86_64/DateTime

LD_LIBRARY_PATHを正しく設定していない可能性があると思っただけです

この?

ls -alh /home/npalko/Development/POCO/lib/Linux/x86_64/libPocoFoundation.so

両方が失敗した場合、私は理由を見ることができません。

于 2009-09-25T23:44:12.037 に答える
1

ライブラリのパスをリンカに指定する必要があります

g++ [blah] -Wl,-rpath=/home/npalko/Development/POCO/lib/Linux/x86_64

-Wlは、リンカーにオプションを渡すことを意味します

-rpathはリンカーオプションです

ランタイムライブラリの検索パスにディレクトリを追加します。これは、ELF実行可能ファイルを共有オブジェクトにリンクするときに使用されます。すべての-rpath引数は連結され、実行時リンカーに渡されます。実行時リンカーは、それらを使用して実行時に共有オブジェクトを検索します。-rpathオプションは、リンクに明示的に含まれている共有オブジェクトが必要とする共有オブジェクトを見つけるときにも使用されます。

于 2009-09-27T12:38:15.247 に答える