【CMake入門・上級(1)】CMakeListsとは何かを理解する例 - 「Hello World」から始める(コード付き)

        前回のコンテンツでは多くのサンプル プログラムを作成しましたが、これらのサンプル プログラムには .c ソース ファイルが 1 つしかなく、非常にシンプルです。したがって、これらのサンプル コードのコンパイルは実際には非常に簡単で、GCC コンパイラを使用して直接コンパイルするだけで、Makefile も必要ありません。しかし、実際のプロジェクトでは、これはそれほど単純ではありません。プロジェクトには数十、数百、場合によっては数千のソース ファイルが含まれており、それらは種類、機能、モジュールに応じて異なるディレクトリに配置されます。プロジェクトでは通常、make ツールを使用して、 Make ツールは、Makefile ファイルに依存して、Makefile ファイルを通じてプロジェクト全体のコンパイル ルールを定義し、Make ツールを使用して、Makefile によって定義されたコンパイル ルールを分析します。

        Makefile がもたらすメリットは「自動コンパイル」で、一度作成した make コマンドは 1 つだけで、Makefile に定義されたコンパイル規則に従ってプロジェクト全体が自動的にコンパイルされるため、ソフトウェア開発の効率が大幅に向上します。Visual C++ の nmake、Linux 上の GNU make、Qt の qmake など、ほとんどの IDE にはこのツールが備わっています。これらの make ツールは異なる仕様や標準に従っており、対応する Makefile ファイルの構文や形式も異なります。重大な問題: ソフトウェアがクロスプラットフォームであることを望む場合、異なるプラットフォームでコンパイルされることを保証する必要があり、上記の Make ツールを使用する場合、規格ごとに Makefile を作成する必要があり、これが問題となります。クレイジーな仕事。

        そして、cmake はこの問題のために生まれました。これにより、開発者はプラットフォームに依存しない CMakeLists.txt ファイルを作成してプロジェクト全体のコンパイル プロセスを定式化し、特定のコンパイル プラットフォームに従ってローカライズされた Makefile とプロジェクト ファイルを生成し、最後に make COMPILE を実行できるようになります。 。

        したがって、ほとんどのプロジェクトでは、Makefile を直接記述するのではなく、より自動化された cmake または autotools を使用して Makefile を生成することを検討する必要があります。

        このコラムでは、プロジェクト プログラミングの出発点でもある cmake について学びます。

cmake の概要

        cmake はクロスプラットフォームの自動ビルド ツールです。概要はすでに紹介しました。cmake の誕生の主な目的は、make+Makefile の直接使用ではクロスプラットフォームを実現できないという問題を解決することでした。そのため、cmake はクロスプラットフォームを実現します。コンパイル ツール、これが最大の機能ですが、もちろんこれに加えて、cmake には次の利点もあります。

  • オープンソースコード ソースコードはcmake 公式 Web サイトhttps://cmake.org/から直接ダウンロードできます。
  • クロスプラットフォームの cmake は、最終的な実行可能ファイルやライブラリ ファイルを直接コンパイルおよびビルドしません。開発者は、プラットフォームに依存しない CMakeLists.txt ファイルを作成してプロジェクト全体のコンパイル プロセスを定式化でき、cmake ツールは CMakeList を解析します。 txt ファイルの文法規則に従って、現在のコンパイル プラットフォームに従ってローカライズされた Makefile とプロジェクト ファイルを生成し、最後に make ツールを通じてプロジェクト全体をコンパイルします。そのため、cmake はさまざまなプラットフォームに従って対応する Makefile のみを生成し、最後にmake ツールを使用してプロジェクトのソース コードをコンパイルしますが、cmake はクロスプラットフォームです。
  • 文法規則は単純です 。Makefile の文法規則は比較的複雑です。初心者にとっては、通常はあまりフレンドリーではありません。また、Makefile の文法規則はプラットフォームによって異なることがよくあります。一方、cmake は CMakeLists.txt ファイルに依存しています。このファイルの文法 ルールはプラットフォームとは関係がなく、文法ルールはシンプルで理解しやすいです。cmake ツールは CMakeLists.txt を解析することで自動的に Makefile を生成するため、手動で Makefile を記述する必要はありません。

cmake と Makefile

        直感的には、cmake は Makefile を生成し、CMakeLists.txt を解析して Makefile を自動的に生成するために使用されるツールです。

         cmake 以外にも automake や autoconf などの自動構築ツールがよく使われているので、興味のある人は自分で調べてみてください。

cmakeの使い方

        cmake はツール コマンドであり、次のように Ubuntu システムの apt-get コマンドを使用してオンラインでインストールできます。

sudo apt-get install cmake

         インストールが完了したら、次のように cmake --version コマンドを使用して cmake のバージョン番号を表示できます。

         上の図からわかるように、現在のシステムにインストールされている cmake の対応するバージョン番号は 3.5.1 であり、cmake ツールのバージョンの更新も比較的高速です。CMake の公式 Web サイトより、cmake の最新バージョンは 3.22.0 ですが、これは問題ではありません。実際に使用されるバージョンはすべて可能であり、違いはそれほど大きくないため、これについて心配する必要はありません。

        cmake ツールをインストールしたら、cmake の使用方法を学びましょう。cmake 公式からも対応するチュートリアルが提供されています。リンク アドレスは次のとおりです。

Documentation | CMake                                                        //ドキュメントの合計リンク アドレス       

CMake チュートリアル — CMake 3.26.4 ドキュメント                //トレーニング チュートリアル

         自己学習能力が高い場合は、公式トレーニング チュートリアルを参照して cmake を学習できます。cmake の学習について、著者は次の 2 つの提案を示しています。

  • シンプルなものから複雑なものまで!
  • ポイントは、自分でもっと練習することです。

        この記事では、cmake の使用方法を紹介する非常に簡単な例から始め、次にこの例をさらに拡張して、より多くの要件を提案し、cmake がこれらの要件をどのように満たすことができるかを見ていきます。

例: 単一ソースファイルのコンパイル

        通常、単一のソース ファイルのプログラムが最も単純ですが、cmake で古典的な C プログラム「Hello World」をビルドするにはどうすればよいですか?        

//main.c
#include <stdio.h>

int main(){
    printf("Hello World!\n");
    return 0;
}

        次に、新しい CMakeLists.txt ファイルを作成する必要があります。Makefile ファイルが make ツールによって解析されるのと同じように、CMakeLists.txt ファイルは cmake ツールによって解析されます。CMakeLists.txt が作成された後、次の内容を記述しますファイル内:

project(HELLO)
add_executable(hello ./main.c)

        書き込み後、保存して終了すると、現在のプロジェクトのディレクトリ構造は次のようになります。

├── CMakeLists.txt
└── main.c

        プロジェクト ディレクトリには、ソース ファイル main.c と CMakeLists.txt の 2 つのファイルがあり、次に示すように、プロジェクト ディレクトリで cmake コマンドを直接実行します。

cmake ./

        cmake の背後にあるパスは CMakeLists.txt ファイルのパスを指定しており、実行結果は次のとおりです。

         cmake を実行すると、ソース ファイル main.c と CMakeLists.txt に加えて、CMakeCache.txt、CmakeFiles、cmake_install.cmake、Makefile、フォーカスなど、他の多くのファイルまたはフォルダーが現在のディレクトリに生成されることがわかります。この Makefile を生成した後、次に示すように、Makefile を使用して make ツールを使用してプロジェクトをコンパイルします。

        makeでコンパイルするとhelloという実行ファイルが得られますが、この名前はCMakeLists.txtファイルで指定しますので、後ほど紹介します。file コマンドを使用すると、hello は x86-64 アーキテクチャの実行可能ファイルであるため、Ubuntu PC でのみ実行できることがわかります。

        hello 実行可能ファイルの実行結果がソース コードと同じかどうかを確認するには、以下に示すように、Ubuntu で直接実行します。

CMakeLists.txt ファイル

        上記では、非常に簡単な例を通じて cmake の使用方法を説明しました。焦点は CMakeLists.txt ファイルを作成することです。次に、CMakeLists.txt ファイルに何が書かれているかを見てみましょう。 

        ⚫ ファーストラインプロジェクト(HELLO)

        project はコマンドであり、コマンドの使用法は C 言語の関数に似ています。コマンドの後に一対のかっこが必要で、通常はパラメーターを指定する必要があり、複数のパラメーターはカンマではなくスペースで区切られます。 「、」。

        project コマンドはプロジェクトの名前を設定するために使用され、括弧内のパラメータ HELLO は設定するプロジェクトの名前です。プロジェクト名の設定は必須ではありませんが、追加することをお勧めします。

        ⚫ 2行目 add_executable(hello ./main.c)

        add_executable も実行可能ファイルを生成するコマンドです。この例では、2 つのパラメータが渡されます。最初のパラメータは生成された実行可能ファイルに対応するファイル名を示し、2 番目のパラメータは対応するソース ファイルを示します。つまり、 add_executable(hello . /main.c) は、hello という名前の実行可能ファイルを生成する必要があり、必要なソース ファイルが現在のディレクトリの main.c であることを示します。

        アウトオブソースを使用してビルドする

        上記の例では、cmake によって生成されたファイルと最終的な実行可能ファイル hello がプロジェクトのソース ファイル main.c と混合されているため、プロジェクトが非常に乱雑に見えます。また、ファイルをクリーンアップする必要があるときに非常に乱雑になります。 cmake によって生成されたファイル トラブル、これは私たちが見たいものではありません。ビルド プロセスによって生成されたファイルをソース ファイルから分離し、それらが混在しないようにする必要があります。つまり、ソース外の方法でビルドする必要があります。 。

        cmake のコンパイルによって生成されたファイルをクリーンアップし、次に示すように、プロジェクト ディレクトリの下にビルド ディレクトリを作成します。

├── build
├── CMakeLists.txt
└── main.c

         次に、ビルド ディレクトリに移動し、cmake を実行します。

cd build/
cmake ../
make

         この方法では、cmake によって生成された中間ファイルと make によってコンパイルされた実行可能ファイルはすべて build ディレクトリにあります。プロジェクトをクリーンアップしたい場合は、build ディレクトリを直接削除するだけで済み、次のように便利です。下の図。

おすすめ

転載: blog.csdn.net/cj_lsk/article/details/130983172
おすすめ