18

事前に依存関係をコンパイルできる C++ ビルドシステム

Java には Maven があり、既にコンパイル済みの依存関係を指定し、Mavens の標準ディレクトリに配置するだけで簡単に操作できます。つまり、依存関係の場所は、よく使用される複数の場所を持つ方法とは対照的に標準化されています ( C/C++ 依存関係の特定の deps のデフォルトのインストール ディレクトリを誰もが覚えているように。

個々の開発者が、ほとんどの場合、構成オプション/ビルドを見つけて読み、慣れ、最終的にすべての依存関係をコンパイルしてプロジェクトのビルドを作成する必要があるため、非常に非生産的です。

これが実装されていない理論的な理由は何ですか?

次のオプションのパッケージを Maven のような宣言形式で提供するのが難しいのはなぜですか?

version
platform (windows, linux)
src/dev/bin
shared/static
equivalent set of Boost ABI options when applicable

手動で Web サイトにアクセスし、2013 年に最も古い主要なプログラミング言語の依存関係を検索する必要があるのはばかげています。

4

3 に答える 3

21

理論的な理由はありません。非常に多くの実際的な理由があります。C++ の世界では、依存関係システムで簡単に標準化するには、さまざまな処理方法が多すぎます。

  • 実装の違い - C++ は複雑な言語であり、歴史的に異なる実装では、サポートの程度 (さまざまな中程度から高度な C++ コードを正しく処理できる程度) が異なります。そのため、特定の実装でライブラリを構築できるという保証はありません。
  • プラットフォームの違い - 一部のプラットフォームでは例外がサポートされていない場合があります。標準ライブラリにはさまざまな実装があり、さまざまな長所と短所があります。Java の標準化されたライブラリとは異なり、Windows と POSIX API はまったく異なる場合があります。ファイルシステムは、標準 C++ の一部でさえありません。
  • コンパイルの違い - 静的か共有か? デバッグまたは本番ビルド? オプションの依存関係を有効にするかどうか 非常に安定したバイトコードを持つ Java とは異なり、C++ には標準 ABI がないため、同じコンパイラで同じプラットフォーム用にビルドされたとしても、コードが正しくリンクされない可能性があります。
  • ビルド システムの違い - Makefile ? (もしそうなら、GNU Make か何か?) Autotools? CMake? Visual Studio プロジェクト ファイル? 他の何か?
  • 歴史的な問題 - C と C++ の時代のせいで、zlib のような一般的なライブラリは、Maven のようなビルド システムよりもかなり前のものです。zlib が行っていることが機能しているのに、なぜ zlib が架空の C++ ビルド システムに切り替える必要があるのでしょうか? zlib のようなライブラリに依存している場合、より新しい高レベルのライブラリを仮想のビルド システムに切り替えるにはどうすればよいでしょうか?

次の 2 つの追加要因により、事態が複雑になります。

  • Linux では、ディストリビューション パッケージ システム、(一般に) 標準化された ABI と、プロジェクトのビルド依存関係を指定する簡単な方法を使用して、開発ライブラリ ヘッダー バイナリの標準化されたリポジトリを提供します。これらの (プラットフォーム固有の) ソリューションの存在は、クロスプラットフォーム ソリューションの推進力を低下させます。
  • これらすべての複雑な要因と既存のアプローチにより、標準ビルド システムを確立しようとすると、XKCD の「標準」で説明されている問題に遭遇します。 状況:
    14 の競合する標準があります。
    「14? ばかげている! 私たちは、すべてのユースケースをカバーする 1 つの普遍的な標準を開発する必要があります。」
    まもなく: 15 の競合する規格があります。

以上のことから、次のように述べています。

将来への希望はいくらかあります。たとえば、CMake は徐々に他のビルド システムに取って代わりつつあるようです。Boost 開発者の中には、あなたが説明していることを実行しようとしてRypplを開始した人もいます。

于 2013-01-10T17:32:22.563 に答える
3

(リンクされた質問にも投稿されています)

現在、正確なバージョン要件を持つC /C++アプリのすべての依存関係を自動的にインストールできるツールに取り組んでいます。

  • コンパイラ
  • libs
  • ツール(cmake、autotools)

今のところ、私のアプリでは機能します。(UnitTest ++、Boost、Wt、sqlite、cmakeをすべて正しい順序でインストールします)

«C++バージョンマネージャー»(優れたRubyバージョンマネージャーに触発された)という名前のツールは、bashでコーディングされ、githubでホストされています:https ://github.com/Offirmo/cvm

どんなアドバイスや提案も歓迎します。

于 2013-01-10T17:44:53.400 に答える
1

まず第一に、すべての依存関係を解決するシステムでは、デフォルトでは生産性が向上しません。潜在的に、生産性がさらに低下する可能性があります。

言語間の違いについては、Java にはパッケージがあり、コードを整理して限られた視野を持たなければならない場合に便利ですが、C++ には同等の概念がありません。C++ では、シンボルを解決できるすべてのライブラリがコンパイラにとって十分です。ライブラリの唯一の実際の要件は、特定の ABI を持ち、必要なシンボルを解決することです。正しいものを選択するために作業できる自動化された方法はありません。これは、関数を実際の実装にリンクするだけの問題です。これは、正しいリンクフェーズがアプリを機能させることさえ許可しません。

これに、ライブラリのバージョン、同じライブラリの異なる実装、同じメソッド名を持つ異なるライブラリなどの重要な変数を追加できます。

例としては、Mesa ライブラリ VS 公式ドライバーの opengl ライブラリ、または複数のリリースを提供し、それぞれがすべてのシンボルを解決できる任意のライブラリがありますが、おそらく他のリリースよりも成熟したリリースがあり、質問することができます独自の目的ではすべて同じであるため、正しいものを選択する必要があります。

于 2013-01-10T17:34:02.617 に答える