5

プロジェクトで libcurl を使用していますが、実行時に openssl と他の .so の束に依存しています。
異なるディストリビューション/バージョンには異なるopensslバージョンが含まれている可能性があるため、この依存関係は一種の厄介な問題です。

たとえば、Ubuntu 9.10 でアプリをコンパイルすると、Ubuntu 11.10 での実行に問題が発生します。

これを解決する方法が 2 つありますが、いずれも私の場合には十分ではありません。

  1. アプリをパッケージ化し、パッケージマネージャーにこの種の問題を解決させます

  2. すべての deps を静的にリンクする

私のアプリは本当に小さく、パッケージ化/維持するのはやり過ぎです。さらに、要件の 1 つは、ダウンロードして実行できることです。したがって、(1)は私にとってオプションではありません。

静的リンク (2) は悪くない解決策ですが、libopenssl、libcrypto、および libcurl に付属するその他の推移的な依存関係の静的バイナリ配布はないようです。

理論的には、libcurl の背後にあるすべてのライブラリを手動で構築しようとすることもできますが、これによりメンテナンスがはるかに複雑になるようです。

では、ここで質問です。何か足りないものはありますか? Linux の世界 (具体的には Ubuntu) で私がやりたいことをより苦痛の少ない方法で行う方法はありますか? どんな提案も歓迎します。

4

4 に答える 4

3

プロジェクトで libcurl を使用していますが、実行時に openssl と他の .so の束に依存しています。異なるディストリビューション/バージョンには異なるopensslバージョンが含まれている可能性があるため、この依存関係は一種の厄介な問題です。

たとえば、Ubuntu 9.10 でアプリをコンパイルすると、Ubuntu 11.10 での実行に問題が発生します。

まず、これの何が問題なのですか?古いバージョンの Ubuntu から新しいバージョンに移行する場合、問題は発生しないはずです。私が間違っていなければ、必要なライブラリの最小バージョンを指定するだけでよく、パッケージ マネージャーは適切なバージョンをインストールできるはずです。非推奨の機能を使用していない限り、新しいバージョンのライブラリによって既存のアプリが壊れることはありません。

私のアプリは本当に小さく、パッケージ化/維持するのはやり過ぎです。さらに、要件の 1 つは、ダウンロードして実行できることです。したがって、(1)は私にとってオプションではありません。

Linux (特に Ubuntu、Fedora、およびその他のトップ ディストリビューション) の場合、パッケージ化は実際にアプリケーションを配布する方法ですダウンロード - インストール - 実行は Windows のものであり、Linux を使用している人がソフトウェアをインストールする方法ではありません (Linux を初めて使用する人はそうかもしれません...)。

また、時間の経過とともに負担を軽減するディストリビューションの受け入れを試みる必要があります。これに向けた最初のステップは、少なくとも Ubuntu では、独自の PPA ( https://help.launchpad.net/Packaging/PPA ) を作成することです。

静的リンク (2) は悪くない解決策ですが、libopenssl、libcrypto、および libcurl に付属するその他の推移的な依存関係の静的バイナリ配布はないようです。

これは通常、非常に悪いことです。ライブラリをアプリに静的にリンクするか、単にバンドルすると、ライブラリを更新する負担がかかり、それらを更新しないと影響があります。したがって、このアプローチはお勧めしません。詳細については、http ://www.dwheeler.com/blog/2012/04/03/#insecure-libraries を参照してください。

Fedora のポリシーは次のとおりです: http://fedoraproject.org/wiki/Packaging:No_Bundled_Libraries

では、ここで質問です。何か足りないものはありますか? Linux の世界 (具体的には Ubuntu) で私がやりたいことをより苦痛の少ない方法で行う方法はありますか? どんな提案も歓迎します。

ここで実際に行うことは 2 つあります。

  1. パッケージ化: 理想的には、これは Ubuntu/Debian の場合は deb、Fedora/Suse の場合は rpm になります。もう 1 つの一般的な方法は、autotools (autoconf/automake) を使用して、ユーザーが必要な前提条件でアプリケーションをビルドできるようにすることです。最後のオプションは、Makefile と README のみを提供し、ユーザーが正しいことを行うことを期待することです。
  2. 配布: 理想的には、これはディストリビューション リポジトリを使用します。Ubuntu PPA は良い出発点です。別の方法は、バイナリ/パッケージを自分のサイトでホストすることです。

最も一般的なアプリケーションは、一般的な Linux ディストリビューション用の .deb/.rpm と、異なるパッケージ システムを持つディストリビューションでビルドするための autotools を備えた .tar.gz の両方を提供します。

最後に、お聞きしたいのですが、アプリケーションを提供する際の負担を軽減すること、またはユーザーがアプリケーションを取得する際の負担を軽減することに重点を置いていますか?

于 2012-05-06T15:52:34.837 に答える
1

3 番目のオプションがあります。

プラットフォームに応じて、ニーズに合った何らかのアーカイブを作成し、必要な .so/.dll ファイルを含めます。ZIP アーカイブは、Linux と Windows の両方で機能するはずです。

次に、Linux インストールのラッパー スクリプトで LD_LIBRARY_PATH を使用します (これにより、.so ファイルを特別な場所 (通常はlibsディレクトリ) に配置できます)。Windows は、私の知る限り、バイナリに必要な .dll ファイルを探す最初の場所として CWD を使用するので、バイナリと同じディレクトリに配置するだけでよいのです。

この方法を使用すると、「配布」を小さく保つことができ、静的リンクやその他の特別な処理は必要ありません。

.so/.dll ファイルの実際の依存関係チェーンを分析して、意図しないライブラリがターゲット環境にロードされても驚かないようにしてください。

于 2012-05-03T10:06:56.807 に答える
0

qtの使用を検討しましたか?あなたは単にそこにそれらの問題を抱えていないでしょう、そして彼らはsslとhttpの強力で簡単なサポートを持っています

于 2012-05-03T07:43:15.880 に答える