2

Linux マシン (Ubuntu Karmic) で完璧に動作する C++ コードがあります。別のバージョンで実行しようとすると、あらゆる種類の共有ライブラリが不足しています。

すべての共有ライブラリを単一の実行可能ファイルにマージする方法はありますか?

編集:間違った質問をしたと思います。実行可能ファイルが既にビルドされているときに、実行可能ファイルを静的にリンクする方法を尋ねる必要がありました。ermine & statifierで答えを見つけました

4

6 に答える 6

6

共有ライブラリが見つからない理由として、次の 3 つが考えられます。

  • 他のディストリビューションにデフォルトで存在しない共有ライブラリを使用している、またはそれらをホストにインストールしているが、他のディストリビューションにはインストールしていない (libDBI.so など)
  • リンク時にバージョンを過剰に指定しました。たとえばlibz.so.1.2.3、他のマシンには API 互換性 (メジャー バージョン1) がありますが、マイナー バージョンが異なり2.3ます。
  • ライブラリのメジャー バージョンが変更されたため、互換性がありませlibc.so.2libc.so.1

修正は次のとおりです。

  • 別のディストリビューションにない必要のないライブラリをリンクしないでください。または、手動で他のマシンに追加のライブラリをインストールするか、インストーラパッケージの依存関係を作成します (たとえば、RPM を使用します)。
  • コマンド ラインでバージョンを厳密に指定しないlibz.so.1libz.so.1.2.3ください。
  • 異なる libc バージョンに対して複数のバージョンをコンパイルします。
于 2010-01-26T17:19:48.553 に答える
4

あなたが説明しているのは、共有ライブラリの代わりに静的ライブラリを使用することです。

于 2010-01-26T17:13:31.733 に答える
2

ここに記載されている元の問題に対して、いくつかの技術的な解決策があります。

異なる libc バージョンに対して複数のバージョンをコンパイルします。

また

他のマシンに追加のライブラリをインストールします

しかし、ISV の立場にある場合、正気の解決策は 1 つしかありません。

古いシステム (たとえば、デスクトップをターゲットにしている場合は Ubuntu 6.x、サーバーをターゲットにしている場合は Red Hat 9 までさかのぼるなど) のクリーン インストールを取得し、その上にソフトウェアをビルドします。通常、ライブラリ (および間違いなく libc) は下位互換性があるため、新しいシステムで問題なく実行できます。

もちろん、非標準または最近のバージョンの lib 依存関係がある場合、これで問題が完全に解決されるわけではありません。その場合、他の人が示唆しているように、堅牢にしたい場合は、dlopen() して問題を報告する (または機能を減らして実行する) ことをお勧めします。

于 2010-01-26T19:15:27.680 に答える
1

よくわかりませんが、すべてのライブラリを静的にリンクして実行可能ファイルを作成することをお勧めします。

于 2010-01-26T17:13:52.133 に答える
1

別の可能な解決策は、statifier (http://statifier.sf.net) または Ermine (http://magicErmine.com) を使用することです。どちらも、動的実行可能ファイルと必要なすべてのライブラリを 1 つの自己完結型実行可能ファイルにパックできます。

于 2010-12-13T05:26:03.933 に答える
1

1 つの代替手段は、を使用して共有ライブラリを動的にロードdlopen()することです。ロードに失敗した場合は、実行可能ファイルが機能するには依存ライブラリが必要であるというメッセージを表示して正常に終了します。
その後、ユーザーは適切なライブラリをインストールできます。

于 2010-01-26T18:52:44.060 に答える