web-dev-qa-db-ja.com

なぜC ++ライブラリの使用がそれほど複雑なのですか?

まず第一に、私はC++が大好きであり、JavaよりもC++でコーディングする方が簡単だと思う人の1人であることを指摘したいと思います。 1つの小さなことを除いて:ライブラリ。

Javaでは、ビルドパスにjarを追加するだけで完了です。

C++では通常、ヘッダーファイルとライブラリ自体に複数のパスを設定する必要があります。場合によっては、特別なビルドフラグを使用する必要があります。私は主にVisual Studio、コードブロックを使用しており、IDEはまったく使用していません。3つのオプションはすべて、外部ライブラリの使用についてそれほど大きな違いはありません。

なぜこれに代わる簡単な方法がなかったのでしょうか。 IDEがビルドフラグを設定するためのすべての作業を実行できるように、必要なすべてが1か所にある特別な.Zipファイルを持っているようなものです。これには技術的な障壁がありますか?

14
Pijusn

C++は、オブジェクト指向プログラミングのサポートにより、より簡単で自動化された言語を作成することにより、C言語を改善するように設計されました。しかし、Cが外部ライブラリとヘッダーファイルを処理する方法を変更または改善するために何もしませんでした。 C++には、より最近の言語のようなモジュールシステムはありません。それでも、Cプリプロセッサとリンカーシステムが使用されます。 C++の明記された目標の1つはCコードとの下位互換性であったため、これはそれほど驚くべきことではありません。すべてのC++モジュールシステムは、古いCヘッダーファイル/リンカーシステムと一緒に動作する必要があります。 C++標準委員会は、より近代的なモジュールシステムの設計に取り掛かっていません。 (彼らはそれに取り組んでいますが、以下のクライムのコメントを参照してください。)

15
Charles Salvia

それは技術的な障壁ではありません。 Linuxでは、「特別なZipファイル」は、パッケージマネージャーを使用してインストールするlibrary-devパッケージであり、インクルードフラグとリンカーフラグの設定は、使用するconfigure.acに数行追加するのと同じくらい簡単です pkg-config 設定します。

Pkg-configはWindowsでも利用できますが、文化的な障壁により、広く普及することはできません。 Unixには、ソースコードを配布することによって移植性を実現する強力な歴史があるため、無料で開発ツールが含まれています。 Windowsには、バイナリ配布のみを奨励し、ツールの開発者に課金するという強い歴史があります。ライブラリを売ってお金を稼ぐとき、第三者がそれらを提供することを容易にすることは意味がありません。

2
Karl Bielefeldt