pyてよn日記

一寸先は闇が人生

CMakeによるビルド(初心者向け)

目次


概要

 CMakeに関して基礎的なことをまとめ、実際にCMakeにより簡単なプログラムをビルドしてみた。ものすごく初歩的な内容になっている。(筆者自身がものすごく初心者であるため。)

経緯

 最近プログラミングの勉強を始めた。C++を書く時のIDE(エディター)としてVSCodeを使っていたが、VSCode上にデバッグ環境をうまく作れなかった。
 そこでIDEをJetBrain社のCLionに変えたら、楽々デバッグできるようになった。しかし、CLionはデフォルトで、ビルドにCMakeを利用していて、プロジェクトを作成するとディレクトリに自動で "CMakeほにゃらら" というディレクトリやらファイルが作られる。これがよく分からなくて気持ち悪いので理解できる範囲で調べたことをまとめてみた。

基礎的用語とCMakeのまとめ

コンパイルとビルド

コンパイル
・・・実行ファイルを作る作業。プログラミング言語で書いたソースコード機械語に翻訳して実行可能なファイルを生成すること。

ビルド
・・・実行ファイルを作る作業。意味はコンパイルと似ているけど、基本的にはコンパイル+αのこと。コンパイル+使っているライブラリなどの関連付けを行って実行ファイルを生成する。 以下のページが分かりやすかった。

CMakeとは?

 CMakeとは、ビルド自動化のためのソフトウェア。 ディレクトリ毎にビルドプロセスを制御するための設定ファイルを置いてビルドを自動化できるそう(簡単に言えばコンパイルするための設定を記述するファイル)。
 私は普段プログラムを書くという行為と全くの無縁のため、無論ソフトウェア、ライブラリ等を作ったこともなく、このCMakeというソフトウェアの有り難みはまだ分からない...(教えて強い人...)


実際にCMakeでビルドしてみた

環境:MacOS HighSierra 10.13.5

手順
1.CMakeのインストール
以下のページからインストール。自分のOSに対して適切なものを選択。
https://cmake.org/download/

2.シンボリックリンクの作成
インストールが完了しても、ターミナルからcmakeコマンドは使えない。そこでターミナルを開き、以下のコマンドでシンボリックリンクを作成する(張る?)ことで、CMakeをターミナルからコマンドで使えるようにする。(文章中の "cmake" はコマンド、"CMake" はソフト自身を指している)

$ sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install
Password:  
Linked: '/usr/local/bin/cmake' -> '/Applications/CMake.app/Contents/bin/cmake'
Linked: '/usr/local/bin/ctest' -> '/Applications/CMake.app/Contents/bin/ctest'
Linked: '/usr/local/bin/cpack' -> '/Applications/CMake.app/Contents/bin/cpack'
Linked: '/usr/local/bin/cmake-gui' -> '/Applications/CMake.app/Contents/bin/cmake-gui'
Linked: '/usr/local/bin/ccmake' -> '/Applications/CMake.app/Contents/bin/ccmake'  

 
3.ビルド
3-1 プログラムの作成
今回は非常に簡単なプログラム my_app.cpp をビルドする。プログラムは以下。

my_app.cpp

#include <iostream>

int main(void) {
    std::cout << "Hello world" << std::endl;
    return 0;
}

 
3-2 ディレクトリの移動
cmakeコマンドを実行するには、プログラムが保存されているディレクトリに移動する必要がある。

$ cd PROJECT_HOME
$ pwd
/Users/mathnuko/PROJECT_HOME
$ ls
my_app.cpp

 
3-3 ビルドの設定ファイル CMakeLists.txt の作成
次にビルドの設定を記述した CMakeLists.txt (Listsなので注意)をディレクトリに作成。今回は最も簡単な構成にした。書き方はQuick CMake Tutorialを参照。

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
add_executable(my_app my_app.cpp)  # my_app は任意の名前で良い

1行目はCMakeのバージョンが2.8以上であることを要請。書かないとエラーが出るらしい。2行目は "my_app" という実行ファイルを "my_app.cpp" から生成するというコマンド。
 
3-4 ビルドから実行まで
コマンドcmake .makeを実行して実行ファイル生成。最後に./my_appで実行ファイルを実行する 。cmake .の.(ドット)は現在のディレクトリを指すので注意。

$ ls
CMakeLists.txt    my_app.cpp  
$ cmake .  
- The CXX compiler identification is AppleClang 9.1.0.9020039
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/mathnuko/PROJECT_HOME
$ make  # カレントディレクトリに実行ファイル my_app が生成
Scanning dependencies of target my_app
[ 50%] Building CXX object CMakeFiles/my_app.dir/my_app.cpp.o
[100%] Linking CXX executable my_app
[100%] Built target my_app
$ ./my_app  # 実行
Hello world

以上、CMakeで簡単なプログラムをビルドしてみた。まだコンパイラの設定の仕方、ヘッダーファイル関連等分からないことだらけであるが、その都度調べて解決していきたい。

後書き

ここまで読んでくださった方、拙い記事に目を通していただきありがとうございます。今回始めてブログというものを書いてみたのですが、自分が理解していないことを再確認させられ良い経験となりました。これからアウトプットを少しずつ増やしてエンジニアとしてのキャリアを歩み始められるように日々精進していきます。(数学の記事も書いていきたい...)また記事中に間違い・ご指摘等ございましたらお気軽に宜しくお願い致します。

参考記事

CMakeを調べる上で、以下の記事を参考にさせていただきました。 qiita.com qiita.com