Linux マシン (Ubuntu Karmic) で完璧に動作する C++ コードがあります。別のバージョンで実行しようとすると、あらゆる種類の共有ライブラリが不足しています。
すべての共有ライブラリを単一の実行可能ファイルにマージする方法はありますか?
編集:間違った質問をしたと思います。実行可能ファイルが既にビルドされているときに、実行可能ファイルを静的にリンクする方法を尋ねる必要がありました。ermine & statifierで答えを見つけました
共有ライブラリが見つからない理由として、次の 3 つが考えられます。
libz.so.1.2.3
、他のマシンには API 互換性 (メジャー バージョン1
) がありますが、マイナー バージョンが異なり2.3
ます。libc.so.2
んlibc.so.1
。修正は次のとおりです。
libz.so.1
でlibz.so.1.2.3
ください。あなたが説明しているのは、共有ライブラリの代わりに静的ライブラリを使用することです。
ここに記載されている元の問題に対して、いくつかの技術的な解決策があります。
異なる libc バージョンに対して複数のバージョンをコンパイルします。
また
他のマシンに追加のライブラリをインストールします
しかし、ISV の立場にある場合、正気の解決策は 1 つしかありません。
古いシステム (たとえば、デスクトップをターゲットにしている場合は Ubuntu 6.x、サーバーをターゲットにしている場合は Red Hat 9 までさかのぼるなど) のクリーン インストールを取得し、その上にソフトウェアをビルドします。通常、ライブラリ (および間違いなく libc) は下位互換性があるため、新しいシステムで問題なく実行できます。
もちろん、非標準または最近のバージョンの lib 依存関係がある場合、これで問題が完全に解決されるわけではありません。その場合、他の人が示唆しているように、堅牢にしたい場合は、dlopen() して問題を報告する (または機能を減らして実行する) ことをお勧めします。
よくわかりませんが、すべてのライブラリを静的にリンクして実行可能ファイルを作成することをお勧めします。
別の可能な解決策は、statifier (http://statifier.sf.net) または Ermine (http://magicErmine.com) を使用することです。どちらも、動的実行可能ファイルと必要なすべてのライブラリを 1 つの自己完結型実行可能ファイルにパックできます。
1 つの代替手段は、を使用して共有ライブラリを動的にロードdlopen()
することです。ロードに失敗した場合は、実行可能ファイルが機能するには依存ライブラリが必要であるというメッセージを表示して正常に終了します。
その後、ユーザーは適切なライブラリをインストールできます。