ロゴ ロゴ

CMakeの使い方 for Windows

ビルド自動化ツールのCMakeを使ってc++コードをビルドします。
すぐに忘れるので備忘録として書いておきます。

ちなみにこれは備忘録(びぼうろく)と読みます。難しいですね。

CMakeって何?

クロスプラットフォーム開発向けに作られたビルドツールです。複数ファイルに及ぶソースコードを分割コンパイルしたいときに有用です。

動作環境

Windows10
cmake version 3.21.3
g++ (MinGW.org GCC Build-2) 9.2.0

環境構築

https://cmake.org/download/ から cmake-3.21.3-windows-x86_64.msiをダウンロードします。あとPathを通しておいてください。

基本的な使い方

とりあえずテキトーにコードを書きます。

#pragma once
void hello();

hello.hpp

#include <iostream>
#include "hello.hpp"

void hello()
{
  std::cout << "hello :)" << std::endl;
}

hello.cpp

#include "hello.hpp"

int main()
{
  hello();
}

main.cpp

同じフォルダ階層にCMakeLists.txtというファイルを作ります。ここに設定を書いていきます。#でコメントアウトできます。

# CMakeのバージョン指定
cmake_minimum_required(VERSION 3.1)

# プロジェクト名 使用する言語
# CXX, C, CUDA, OBJC, OBJCXX, Fortran, HIP, ISPC, ASMなどが指定可能
# 今回はC++なのでCXXを指定
project(cmake_example CXX)

#オプション指定
set(CMAKE_CXX_FLAGS "-std=c++2a -Wall --pedantic-errors")

# main.cpp hell.cpp から a.exe を生成
add_executable(a main.cpp hello.cpp)

CMakeLists.txt

buildというフォルダを作りその中でcmakeを実行します。
cmake [CMakeLists.txtがあるフォルダ] [オプション]
今回はMakefileを吐き出すようにオプションをつけてます。

>mkdir build
>cd build
>cmake .. -G"MinGW Makefiles"

そうするとbuildフォルダーの中にファイルがもちゃもちゃできます。これらはビルドするに必要なファイルです(この時点ではビルドできていない)。

ここまできたら、ビルドができます。

>cmake --build .

buildフォルダ下にa.exeファイルができます。

>a
hello :)

今回は非常に簡単な例なので、ぶっちゃけコマンド叩いたほうが早いのですが。ファイルが増えてくるとコンパイルとリンクを自動でやってくれるのは非常にありがたいです。

batファイルにcmakeのコマンドを書いていけばさらに便利です。

@echo off
cd build
cmake .. -G"MinGW Makefiles"
cmake --build .
cd ..

build.bat

@echo off
cd build
cmake .. -G"MinGW Makefiles"
cmake --build .
a
cd ..

run.bat

>run
hello :)

使用例

これで効率アップでやる気もアップ!……するといいですね。

最終的なフォルダ構成

よく見るとa.dirのところにオブジェクトファイルできてますね。

C:.
│  build.bat
│  CMakeLists.txt
│  hello.cpp
│  hello.hpp
│  main.cpp
│  run.bat
│
└─build
    │  a.exe
    │  CMakeCache.txt
    │  cmake_install.cmake
    │  Makefile
    │
    └─CMakeFiles
        │  cmake.check_cache
        │  CMakeDirectoryInformation.cmake
        │  CMakeOutput.log
        │  Makefile.cmake
        │  Makefile2
        │  progress.marks
        │  TargetDirectories.txt
        │
        ├─3.21.3
        │  │  CMakeCXXCompiler.cmake
        │  │  CMakeDetermineCompilerABI_CXX.bin
        │  │  CMakeRCCompiler.cmake
        │  │  CMakeSystem.cmake
        │  │
        │  └─CompilerIdCXX
        │      │  a.exe
        │      │  CMakeCXXCompilerId.cpp
        │      │
        │      └─tmp
        ├─a.dir
        │      build.make
        │      cmake_clean.cmake
        │      compiler_depend.internal
        │      compiler_depend.make
        │      compiler_depend.ts
        │      depend.make
        │      DependInfo.cmake
        │      flags.make
        │      hello.cpp.obj
        │      hello.cpp.obj.d
        │      link.txt
        │      linklibs.rsp
        │      main.cpp.obj
        │      main.cpp.obj.d
        │      objects.a
        │      objects1.rsp
        │      progress.make
        │
        └─CMakeTmp

参考

CMakeの使い方(その1)
cmake-commands(7)

コメント入力

関連サイト