Looking for cmake Answers? Try Ask4KnowledgeBase
Looking for cmake Keywords? Try Ask4Keywords

cmakecmakeを使い始める


備考

CMakeは、主にC ++用のコードビルドの定義と管理のためのツールです。

CMakeはクロスプラットフォームのツールです。プロジェクトがどのようにビルドされているかという単一の定義を持つことで、サポートされているプラ​​ットフォームの特定のビルド定義に変換されます。

異なるプラットフォーム固有のビルドシステムと組み合わせることでこれを実現します。 CMakeは、特定のプラットフォームごとにビルド入力を生成する中間段階です。 Linuxでは、CMakeはMakefileを生成します。 Windowsでは、Visual Studioプロジェクトを生成することができます。

ビルドの動作は、ソースコードのすべてのディレクトリにあるCMakeLists.txtファイルで定義されます。各ディレクトリのCMakeListsファイルはCMakeListsシステムがその特定のディレクトリで何をすべきかを定義します。また、CMakeがどのサブディレクトリも同様に扱うべきであることを定義します。

典型的なアクションは次のとおりです。

  • このディレクトリの一部のソースファイルからライブラリまたは実行可能ファイルをビルドします。
  • ビルド中に使用されるインクルードパスにファイルパスを追加します。
  • ビルドシステムがこのディレクトリとそのサブディレクトリで使用する変数を定義します。
  • 特定のビルド構成に基づいてファイルを生成します。
  • ソースツリーのどこかにあるライブラリを探します。

最終的なCMakeListsファイルは、その範囲が非常に限定されているので、非常に明快で簡単です。それぞれは、現在のディレクトリに存在するものだけを処理します。

CMakeの公式リソースについては、CMakeのドキュメンテーションチュートリアルを参照してください。

バージョン

バージョン発売日
3.9 2017-07-18
3.8 2017-04-10
3.7 2016-11-11
3.6 2016-07-07
3.5 2016-03-08
3.4 2015-11-12
3.3 2015-07-23
3.2 2015-03-10
3.1 2014年12月17日
3.0 2014年6月10-10日
2.8.12.1 2013-11-08
2.8.12 2013年10月11日
2.8.11 2013-05-16
2.8.10.2 2012-11-27
2.8.10.1 2012-11-07
2.8.10 2012-10-31
2.8.9 2012-08-09
2.8.8 2012-04-18
2.8.7 2011-12-30
2.8.6 2011-12-30
2.8.5 2011年7月8日
2.8.4 2011-02-16
2.8.3 2010-11-03
2.8.2 2010-06-28
2.8.1 2010-03-17
2.8 2009-11-13
2.6 2008-05-05

図書館としての "Hello World"

この例は、 "Hello World"プログラムをライブラリとしてデプロイする方法と、それを他のターゲットとリンクする方法を示しています。

http://www.riptutorial.com/cmake/example/22391/-hello-world--with-multiple-source-filesの例と同じソース/ヘッダーファイルがあるとします 。複数のソースファイルから構築するのではなく、まずadd_library() を使用してライブラリとしてfoo.cpp をデプロイした後、 target_link_libraries() target_link_libraries() してメインプログラムとtarget_link_libraries() ます。

CMakeLists.txtを次のように変更します

cmake_minimum_required(VERSION 2.4)

project(hello_world)

include_directories(${PROJECT_SOURCE_DIR})
add_library(applib foo.cpp)
add_executable(app main.cpp)
target_link_libraries(app applib)
 

同じ手順で同じ結果が得られます。

複数のソースファイルを持つ "Hello World"

まず、 include_directories() でヘッダファイルのディレクトリを指定してから、 add_executable() でターゲットの実行可能ファイルの対応するソースファイルを指定し、ソースファイルに正確に1つのmain() 関数があることを確認する必要があります。

以下は簡単な例です。すべてのファイルは、 PROJECT_SOURCE_DIR というディレクトリに置かれているものとみなされます。

main.cpp

#include "foo.h"

int main()
{
    foo();
    return 0;
}
 

foo.h

void foo();
 

foo.cpp

#include <iostream>
#include "foo.h"

void foo()
{
    std::cout << "Hello World!\n";
}
 

CMakeLists.txt

cmake_minimum_required(VERSION 2.4)

project(hello_world)

include_directories(${PROJECT_SOURCE_DIR})
add_executable(app main.cpp foo.cpp)  # be sure there's exactly one main() function in the source files
 

上記の例と同じ手順でプロジェクトを構築することができます。 app を実行すると印刷されます

>./app
Hello World!
 

CMakeのインストール

CMakeのダウンロードページに行き、Windows、Linux、Mac OS Xなどのオペレーティングシステム用のバイナリを入手します。Windowsではバイナリをダブルクリックしてインストールします。 Linuxでは、ターミナルからバイナリを実行します。

Linuxでは、ディストリビューションのパッケージマネージャーからパッケージをインストールすることもできます。 Ubuntu 16.04では、次のコマンドラインとグラフィカルアプリケーションをインストールできます。

sudo apt-get install cmake
sudo apt-get install cmake-gui
 

FreeBSDでは、次のコマンドラインとQtベースのグラフィカルアプリケーションをインストールすることができます:

pkg install cmake
pkg install cmake-gui
 

Mac OSXでは、あなたのソフトウェアをインストールするために利用可能なパッケージマネージャの1つ、最も注目すべきはMacPorts( MacPorts )とHomebrew( Homebrew )を使用すれば、それらのいずれかを使ってCMakeをインストールすることもできます。たとえば、MacPortsの場合、次のように入力します

sudo port install cmake  
 

CMakeをインストールしますが、Homebrewパッケージマネージャーを使用する場合は、

brew install cmake
 

CMakeをインストールしたら、次のようにして簡単にチェックすることができます

cmake --version
 

次のようなものが表示されます

cmake version 3.5.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).
 

シンプルな "Hello World"プロジェクト

main() 関数を定義するC ++ソースファイルmain.cpp CMakeLists.txt 、付随するCMakeLists.txt ファイル(以下の内容)は、 CMakeに現在のシステムとデフォルトのC ++コンパイラの適切なビルド命令を生成するよう指示します。

main.cpp C ++ Hello Worldの例

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    return 0;
}
 

CMakeLists.txt

cmake_minimum_required(VERSION 2.4)

project(hello_world)

add_executable(app main.cpp)
 

それはColiruに生きて見る

  1. cmake_minimum_required(VERSION 2.4) は、現在のスクリプトを評価するのに必要なCMakeの最小バージョンを設定します。

  2. project(hello_world) は新しいCMakeプロジェクトを開始します。これは、多くの内部CMakeロジック、特にデフォルトのCおよびC ++コンパイラの検出を引き起こします。

  3. add_executable(app main.cpp) を使用すると、ビルドターゲットapp が作成されます。これにより、現在の設定用のいくつかのデフォルトフラグが設定されたコンパイラが呼び出され、指定されたソースファイルmain.cpp から実行可能app がコンパイルされます。

コマンドライン (インソースビルド、推奨しない)

> cmake .
...
> cmake --build .
 

cmake . コンパイラの検出は、与えられたCMakeLists.txt を評価し. 現在の作業ディレクトリにビルド環境を生成します。

cmake --build . コマンドは、必要なbuild / makeコールの抽象です。

コマンドライン (Out-of-Source、推奨)

ビルド成果物からソースコードをきれいに保つには、「ソース外」ビルドを行う必要があります。

> mkdir build
> cd build
> cmake ..
> cmake --build .
 

また、CMakeは上の例からあなたのプラットフォームシェルの基本コマンドを抽象化することもできます:

> cmake -E make_directory build
> cmake -E chdir build cmake .. 
> cmake --build build 
 

デバッグとリリースなどのビルドタイプの切り替え

CMakeはいくつかのビルドタイプを知っています。これらのビルドタイプは、デフォルトのコンパイラやリンカのパラメータ(デバッグ情報の作成など)や代替コードパスに影響します。

デフォルトでは、CMakeは以下のビルドタイプを扱うことができます:

  • デバッグ :通常、古典的なデバッグビルド。デバッグ情報、最適化などは含まれません。
  • リリース :一般的なリリースビルドで、デバッグ情報と完全な最適化が不要です。
  • RelWithDebInfo:: Releaseと同じですが、デバッグ情報があります。
  • MinSizeRel :サイズに合わせて最適化された特別なリリースビルド。

設定の処理方法は、使用されているジェネレータによって異なります。

いくつかのジェネレータ(Visual Studioなど)は複数の設定をサポートしています。 CMakeは一度にすべての設定を生成し、IDEから選択するか、-- --config CONFIGcmake --build を使用)を使用して構築したい設定を選択することができます。これらのジェネレータのために、CMakeはビルドディレクトリ構造を生成するために最善を尽くして、異なるコンフィギュレーションからのファイルがお互いに進まないようにします。

単一の構成(Unix Makefileなど)のみをサポートするジェネレータは、動作が異なります。ここで現在アクティブな構成は、CMake変数CMAKE_BUILD_TYPE 値によって決定されます。

たとえば、異なるビルドタイプを選択するには、次のコマンドラインコマンドを発行します。

cmake -DCMAKE_BUILD_TYPE=Debug path/to/source
cmake -DCMAKE_BUILD_TYPE=Release path/to/source
 

CMakeスクリプトはCMAKE_BUILD_TYPE 自体の設定を避けるべきです。 CMAKE_BUILD_TYPE 、一般的にユーザーの責任とみなされているからです。

単一構成の発電機の場合、構成を切り替えるにはCMakeを再実行する必要があります。その後のビルドでは、以前の設定で生成されたオブジェクトファイルを上書きする可能性があります。