209

私はこれを自分だけに求めているのではありません。CMakeLists.txtこの質問が、私が好きな多くの初心者の参考になることを願っています。このような小さなファイル の場合、舞台裏で何が起こっているのかについて完全に困惑しています。

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

そしてこんなに小さいtutorial.cpp

int main() { return 0; } 

非常に多くのファイルが生成されます

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

非常に多くのファイルとCMakeFilesフォルダーを含むフォルダー

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

舞台裏で何が起こっているのか (つまり、なぜファイルを生成しなければならなかったのか、その目的は何か) を理解していなかったことが、CMake を学ぶ上での最大の障害でした。

どなたかご存知でしたら、後世のために教えていただけないでしょうか。これらのファイルの目的は何ですか? と入力cmake .すると、プロジェクトをビルドする前に cmake が構成および生成するのは正確には何ですか?

4

3 に答える 3

117

秘訣は、生成されたファイルが何をするかを理解する必要がないことです。

CMake は、ビルド システムに多くの複雑さをもたらします。そのほとんどは、複雑なソフトウェア プロジェクトの構築に使用する場合にのみ効果があります。

幸いなことに、CMake は、この混乱の多くをうまく回避してくれます。アウト オブ ソース ビルドを使用すれば、生成されたファイルを確認する必要さえありません。これまでにこれを行っていない場合 (あなたが書いたように、そうであると思いますcmake .)、先に進む前にそれらを確認してください。ビルド ディレクトリとソース ディレクトリを混在させることは、CMake では非常に苦痛であり、システムの使用方法ではありません。

一言で言えば:代わりに

cd <source_dir>
cmake .

いつも使う

cd <build_dir_different_from_source_dir>
cmake <source_dir>

通常、ソース ディレクトリ内の空のサブフォルダーbuildをビルド ディレクトリとして使用します。

痛みを和らげるために、CMake が生成する関連ファイルの概要を簡単に説明します。

  • プロジェクト ファイル/Makefiles - 実際に関心のあるもの: 選択したジェネレーターでプロジェクトをビルドするために必要なファイル。これは、Unix Makefile から Visual Studio ソリューションまで、何でもかまいません。
  • CMakeCache.txt - これは、実行間で値をキャッシュするために使用される永続的なキー/値文字列ストレージです。ここに格納される値は、ライブラリの依存関係へのパス、またはオプションのコンポーネントをビルドするかどうかです。ccmake変数のリストは、またはを実行したときに表示されるものとほとんど同じですcmake-gui。これは時々見ると便利ですが、可能であれば前述のツールを使用して値を変更することをお勧めします。
  • 生成されたファイル- これは、自動生成されたソース ファイルから、ビルドされたプロジェクトを他の CMake プロジェクトと再統合するのに役立つエクスポート マクロまで、何でもかまいません。これらのほとんどはオンデマンドでのみ生成され、質問のような単純なプロジェクトには表示されません。
  • それ以外は、ビルド システムを満足させるためのほとんどのノイズです。特に、サブディレクトリ内で起こっていることを気にする必要はありませんでしたCMakeFiles

一般に、CMake が生成するファイルをいじってはいけません。すべての問題は、何らかの方法で内部から解決できますCMakeLists.txt。結果が期待どおりにプロジェクトをビルドする限り、おそらく問題ありません。面倒な詳細についてはあまり心配しないでください。これは、CMake が最初に回避しようとしていたことです。

于 2013-07-08T13:58:36.957 に答える
19

そのウェブサイトに記載されているように:

Cmake は、コンパイラに依存しない方法を使用してソフトウェアのビルド プロセスを管理するための、クロスプラットフォームのオープンソース ビルド システムです。

ほとんどの場合、プロジェクト/メイクファイルを生成するために使用されます-あなたの例ではMakefile、ソフトウェアをビルドするために使用されるものを生成しました(主にLinux/Unixプラットフォームで)。

Cmake では、特定のコンパイル/プラットフォーム用のプラットフォーム固有のプロジェクト/メイク ファイルを生成するクロス プラットフォーム ビルド ファイルを提供できます。

たとえば、Visual Studio を使用して Windows でソフトウェアをコンパイルしてから、CMakeLists.txtファイルに適切な構文を使用して起動することができます。

cmake .

Windows プラットフォームのプロジェクトのディレクトリ内に、Cmake は必要なすべてのプロジェクト/ソリューション ファイル (.slnなど) を生成します。

Linux/Unix プラットフォームでソフトウェアをビルドする場合は、CMakeLists.txtファイルがあるソース ディレクトリに移動して同じものをトリガーするcmake .だけで、シンプルな makeまたはmake all.

ここでは、主要な Cmake 機能に関する非常に優れたプレゼンテーションがありますhttp://www.elpauer.org/stuff/learning_cmake.pdf

編集

プラットフォーム依存のライブラリ インクルード / 変数定義などを作成したい場合は、この構文をCMakeLists.txtファイルで使用できます。

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

ビルドが失敗するのを防ぐことができるコマンドもたくさんあります。Cmake は、たとえばシステムにブースト ライブラリがなくfilesystemregexインストールされていないことを通知します。これを行うには、次の構文を使用できます。

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

適切なシステム/IDE/コンパイラのメイクファイルが生成されることを確認しました。

于 2013-07-08T11:23:37.750 に答える