C/C++ に関する私の基本的な問題は、ライブラリのコンパイルの領域にあります。たとえば、ソフトウェア A はライブラリ Z を使用するため、ソフトウェア A をコンパイルしてその後使用および/または開発する前に、ライブラリ Z をコンパイルする必要があります。
多くの場合、プロジェクトを構成してから make + make install を呼び出すという概念があります。たとえば、コマンド ラインを開いて次のように入力します。
./configure
make
make install
./configure
プロジェクトの最上位ディレクトリに配置されるシェル スクリプトです。すべての依存関係がシステムに存在するかどうかを確認し、これらの依存関係へのパスを保存すると思います。後で、make はこの収集された情報を使用して、それぞれのインクルード パスとライブラリの場所 (.so/.a ファイルの場所など) をコンパイラに提供できます。
make
ソースファイルを正しい順序でコンパイルおよびリンクする責任があります(I-dont-knowによって生成され、XYZ形式のmakefileで指定されているとおり)。もちろん、それ自体をコンパイル/リンクするのではなく、実際のコンパイラとリンカーを呼び出して作業を行います。
make install
結果のバイナリ ファイルを取得し、システム内のどこかに配置します (たとえば、プロジェクトがライブラリの場合は /usr/lib、実行可能ファイルの場合は /usr/bin )。手元のプロジェクトがライブラリの場合、おそらくライブラリのヘッダー ファイルも取得し、システムのどこかにインストールします。
これは比較的複雑なプロセスです。このタイプのコンパイル プロセスを表すために CMI を使用しましょう (CMI = configure-make-install)。また、CMI の概念は、私が知る限り、Linux の世界に固有のものです。たとえば、./configure の実行に使用できるシェルがないなどの理由で、Windows ではそのようには機能しません。make は gcc/g++ に限定されている可能性もありますが、そうなのかどうかはわかりません。
最も重要なことは、私はそれをどこで調べればよいかさえ知りません. また、CMI の概念が異なるバージョンのライブラリの同時インストールをサポートしているかどうかも調べたいと思います。あなたがソフトウェア B とソフトウェア C の開発者であるとします。ソフトウェア B と C はどちらもライブラリ Y に依存していますが、何らかの理由で、B には Y 1.0.x が必要であり、C には 1.1.x が必要です。make install がライブラリのヘッダー ファイルをシステムのどこかに配置した場合、衝突は発生しませんか? 繰り返しますが、私は自分自身に尋ねます。どこでそれを調べることができますか?
ライブラリの例について説明しましょう: libzip。ホームページには、サポートまたは推奨されるコンパイラまたはプラットフォームは記載されていません。今、どのように進めますか?
興味深いことに、このページでは、MySQL Workbench が libzip を使用していると主張しています。MySQL Workbench も Windows 用に提供されているので、libzip は Windows でコンパイルできると思います。
また、libzip にはCMakeLists.txt と構成スクリプトが同梱されていることもわかりました。おそらくpkg-configツール用のlibzip.pc.in CMake テンプレートもあります。Makefile.am (それが何であれ) と、別の CMake テンプレートと思われる Makefile.in もあります。最後になりましたが、フォルダー m4 と .m4 ファイル (m4 フォルダー内とプロジェクトのルート フォルダーの両方) に気付きました。ただし、cmake-config.h.in、cmake-zipconf.h.in を忘れないでください。
そのため、libzip をコンパイルする場合は、次の代替手段を検討する必要があります。
- CMI の概念を使用する
- Windowsには適用されません(そうですか?)
- 一種のメタ ビルド システムである CMake を使用する
- 次に、どのコンパイラ/IDE CMake を生成するかを決定する必要があります: gcc? MSVC? Mingw または QTSDK/MingW? (違いはともかく)
- それが何であれ、M4を使用するかもしれません
M4 は GNU autoconf に関連しているようです。上記のリストに追加することもできると思います。
(補足: これまでのところ、CMake + Visual Studio 2010 の組み合わせを使用して libzip をコンパイルしようとしました。現在、あらゆる種類のコンパイル エラーを修正しています。)
これは私の中心的な観察です:
libzip は単純なライブラリです。ほんの一部のzipのもの。しかし、コンパイルには非常に多くのツールが必要なため、上級プログラマーにとっても非常に困難な作業です。
また、これらのツールのほとんどのドキュメントが不足しています (そうでなければ、答えがどこにあるのかわからず、なぜこれらすべての質問があるのでしょうか?)。言うまでもなく、ほとんどのツールは、バグのある CMake FindPackage-scripts sighなどを修正するためにリバース エンジニアリングに何時間も費やさないと機能しません。
私はそのようにWEEKSを続けることができました。多数のコンパイルの概念、それらすべてが互いにどのように関連しているか、どのプラットフォームとコンパイラがうまく機能するかなどについて、私は迷っています。
別の例: RetroShare。Windows のコンパイル プロセスは文書化されていますが、コンパイルを完了するのは非常に困難です。Windows で RetroShare をコンパイルするには、QtSDK/MingW、Cygwin、および MingW/MSYS が必要であり、それらはすべて異なる部分/依存関係にあることを考慮してください。これらのツールはどのように連携しますか?
私は完全に途方に暮れており、これらすべてのツール/ツールチェーン/コンパイラ/プラットフォームを考慮して、この種の問題にどのように対処し、深刻な損傷から心をどのように保護するかを教えてほしい.
あなたたちは非常に賢いですか、それとも私は非常に愚かですか? なぜこれは非常に複雑なのですか (またはそうでないのですか)?