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

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

Windowsで依存関係のあるプログラムをコンパイルするときは、必要なプログラムを含む対応する.dllddlsを別のコンピュータにコピーし、そのDLLをプログラムディレクトリに配置します。

今私の問題は次のとおりです。 Ubuntuはclangとclang ++を使用してプログラムをコンパイルしましたが、コンパイルされたプログラムをマイサーバー(CentOS)に転送すると、ライブラリが見つからないためプログラムがロードされません。私のライブラリを自分のコンピュータからサーバーに転送したいのですが、可能かどうかわかりません。

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

答え1

ファイルをシステム全体のディレクトリにランダムに.soコピーすることは、パッケージシステムの制御を認識せずに共有ライブラリをターゲットシステムにコピーし、潜在的にインストールされたソフトウェアと競合する可能性があるため、良い習慣ではありません。手動で簡単にマッピングできます。

マイルは異なる場合がありますが、3つの方法があります。

1つ目は、ターゲットディストリビューションと互換性のあるライブラリバージョンを含む必須パッケージをインストールすることです。ただし、ルートが必要ですが、あなたが表示したものはオプションではありません。とにかく、これがある時点でオプションになると、このアプローチに役立ついくつかのヒントは次のとおりです。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動的リンカーに特定のバージョンのライブラリをプリロードするように強制し、システム全体のバージョンをオーバーライドします。

関連情報