0

まず第一に、私はここで正しい文脈で質問をすることを願っています...

Code::Blocksを使用してC++でアプリケーションを構築します。このアプリケーションは、サードパーティによって提供され、パッケージ管理を介してシステムにインストールできない静的ライブラリを使用します。したがって、アプリケーションを配布するときにこれらのライブラリを出荷します。

ターゲット構成は次のようになります。

<Target title="Unix_162">
<Option output="bin/my_app" prefix_auto="1" extension_auto="1" />
<Option working_dir="/home/marco/third_party_dist/lib" />
<Option object_output="obj/Unix_162" />
<Option type="1" />
<Option compiler="gcc" />
<Option use_console_runner="0" />
<Option parameters="-c" />
<Compiler>
<Add directory="/home/marco/third_party_dist/include" />
</Compiler>
<Linker>
<Add library="/home/marco/third_party_dist/lib/lib1.so" />
<Add library="/home/marco/third_party_dist/lib/lib2.so" />
<!-- some more included the same way -->
<Add directory="/home/marco/third_party_dist/lib" />
</Linker>
</Target>

このターゲットをうまく構築して実行できます。すべてが機能します。

今日、私はDebian Squeezeで実行しようとし、実行可能ファイルとサードパーティのライブラリの両方を含むフォルダをコピーしました。すべてが1つのフォルダーにある限り、実行可能ファイルは.soファイルを見つけると思いました。私は間違っていた。メッセージが表示されます:

/home/my_app/my_app: error while loading shared libraries: lib1.so: cannot open shared object file: No such file or directory

Code :: Blocksは実行可能ファイルの作業ディレクトリを設定できるため、開発マシンでこのメッセージが表示されません。/etc/ld.so.conf.d/my_app.conf内に.soファイルの場所を置くことでエラーメッセージを削除できます...

とにかく実行可能ファイルをビルドして、実行ディレクトリ内のライブラリを検索することはできますか?または、これはDebianに固有の問題ですか?または、実行可能ファイルを実行する前に、プロセスの作業ディレクトリを指定できますか?

アプリケーションを起動する前に、システム構成/環境を変更しないようにしたい...

4

3 に答える 3

2

まず、これらは静的ライブラリではありません(共有されています)。

したがって、問題は実行時にライブラリを見つけることです。
これを行うには、いくつかの方法があります。

1)LD_LIBRARY_PATH環境変数を設定します。
これはPATHに似ていますが、共有ライブラリ用です。

2)実行可能ファイルにrpathを設定します。
これは、共有ライブラリを検索する実行可能ファイルに戻るパスです。

-Wl,-rpath,<LIB_INSTALL_PATH>

. これは、現在のディレクトリで検索されるように設定できます。
または'$ORIGIN'、アプリケーションがインストールされているディレクトリで検索されるように設定できます。

3)共有ライブラリのデフォルトの場所の1つにそれらをインストールできます。
中を見てくださいが、/etc/ld.so.conf通常は/usr/lib/usr/local/lib

4)デフォルトの場所をさらに追加できます
変更/etc/ld.so.conf

于 2012-08-02T15:07:33.553 に答える
0

はい、あります。ライブラリのパスである-rpath <path>リンカーにオプションを渡す必要が<path>あります(オプションと同様-L)。

また、おそらく静的ライブラリではなく、共有ライブラリについて話しているでしょう。

于 2012-08-02T14:55:53.980 に答える
-1

すべてが1つのフォルダーにある限り、実行可能ファイルは.soファイルを見つけると思いました。私は間違っていた。

Linuxダイナミックリンカが実行可能ファイルと同じディレクトリにある共有ライブラリを検索するようにするには、追加の手順が必要です。実行可能ファイルをオプションでリンクし-Wl,-rpath,'$ORIGIN'ます(makefileではの$ように引用符で囲む必要があります-Wl,-rpath,'$$ORIGIN')。詳細については、$ORIGINおよびrpathノートを参照してください。

于 2012-08-02T16:11:50.280 に答える