web-dev-qa-db-ja.com

あるマシンでコンパイルされたプログラムを別のマシンに移動し、ライブラリの依存関係の問題を回避する

Windowsで.dllの依存関係を持つプログラムをコンパイルするときは、目的のプログラムを含むそれらのdllを別のPCにコピーし、DLLをプログラムディレクトリ内に配置するだけで十分です。

これが私の問題です:clangとclang ++を使用してUbuntuでプログラムをコンパイルしました。コンパイルしたプログラムをサーバー(CentOS)に転送すると、ライブラリがないためプログラムがロードされません。ライブラリをPCからサーバーに転送しようと思っていましたが、それが可能かどうかわかりません。

ルートパスワードがないため、そのサーバーにプログラムをインストールできません。この問題を解決する方法はありますか?

6
Chester96

.soファイルをシステム全体のディレクトリに任意にコピーすることは、共有ライブラリをパッケージシステムコントロールの認識なしに宛先システムにコピーするため、インストールされたソフトウェアとの競合を引き起こしたり、他の依存関係を欠いたりする可能性があるため、お勧めできません手動で簡単にマッピングできます。

マイレージは異なる場合がありますが、探すことができる3つの異なるアプローチがあります。

1つ目は、互換性のあるバージョンのライブラリを含む必要なソフトウェアパッケージを宛先のディストリビューションにインストールすることです。ただし、これには、オプションではないと指定したrootが必要です。いずれにせよ、これがいつかオプションになる場合は、このアプローチに役立つヒントをいくつか示します。ldd you_executable_fileは、特定のプログラムのライブラリ依存関係を示します。そのようなライブラリを提供するディストリビューションでパッケージを検索できます(たとえば、Fedoraでは、yum provides path_to_required_fileを使用して、インストールする必要のあるパッケージを通知できます。

2つ目は、ディストリビューションに依存しない実行可能ファイルを作成することです。このような目的のために、ソフトウェアをコンパイルするときは、代わりに静的ライブラリを使用する必要があります。通常、Linuxのほとんどのライブラリの共有(.so)バージョンと静的(.a)バージョンの両方を見つけることができます。静的バージョンを使用して、オブジェクトファイル(.o)であるかのようにリンクする必要があります。欠点は、生成されたバイナリは、それ自体の中にすべてのライブラリコードを運ぶため、共有ライブラリを使用する場合よりもはるかに大きくなることです。また、後でシステムにインストールされるライブラリのバグ修正の影響を受けません(プログラムを新しい修正バージョンで再コンパイルする必要があります)。

3番目のオプションは、実際にライブラリを新しいシステム(ルートではない場合でも)のホームディレクトリの下のディレクトリにコピーし、LD_LIBRARY_PATHおよび/またはLD_PRELOAD環境変数を使用してダイナミックリンカーに使用を強制することです。ライブラリのコピー。多くのライブラリをコピーする必要があるかもしれないことに注意してください(これは、前述のlddコマンドを使用して見つけることができます)。 LD_LIBRARY_PATHは、動的リンカーに、不足しているライブラリを見つけるために追加のパスを調べるように指示します。 LD_PRELOADは、ダイナミックリンカにシステム全体のバージョンを上書きするライブラリの特定のバージョンをプリロードするように強制します。

5
Marcelo