はじめに
今回はCMake
を初めて触ってみるという記事です。
CMake is a tool to manage building of source code. Originally, CMake was designed as a generator for various dialects of Makefile, today CMake generates modern buildsystems such as Ninja as well as project files for IDEs such as Visual Studio and Xcode.
CMake Reference Documentation — CMake 3.24.0-rc1 Documentation
// DeepL翻訳
CMakeはソースコードのビルドを管理するためのツールです。元々、CMakeは様々なMakefileの方言の生成ツールとして設計されましたが、今日ではNinjaのような最新のビルドシステムや、Visual StudioやXcodeのようなIDE用のプロジェクトファイルの生成も行っています。
最初に言っておくと、私自身まだ分かっていないことが多くかなり自己満足的な記事になっているのであしからず。
インストール
Homebrew
を使える環境ならば以下のコマンドを打つだけです。
$ brew install cmake
準備
以下のファイルを用意しました
. |--- sample.hpp |--- sample.cpp |--- main.cpp
// sample.hpp #ifndef SAMPLE_H #define SAMPLE_H void method(); #endif
// sample.cpp #include <iostream> #include "sample.hpp" void method(){ std::cout << "Hello, World!" << std::endl; }
// main.cpp #include "sample.hpp" int main(){ method(); }
お手製ビルド
まずはCMake
を利用せずに自分でg++
を利用してビルドを行ってみます。
オブジェクトファイル生成
.cpp
ファイルを一度.o
へのビルドを行います。
g++ -c main.cpp sample.cpp
するとmain.o
とsample.o
が新しく生成されるはずです。
. |--- sample.hpp |--- sample.cpp |--- sample.o |--- main.cpp |--- main.o
この.o
というのはオブジェクトファイルのことを指します。
コンピュータプログラムを作成する際、通常はまず人間が記述・解釈しやすいプログラミング言語を用いてプログラムを作成する。これをソースコードという。
これはそのままではコンピュータ(のCPU)が解釈・実行することはできないため、機械が理解できる機械語(マシン語)などで書かれたオブジェクトコード(バイナリコード)に変換する必要がある。この工程はコンパイラなどのソフトウェアを用いて行うことが多く、変換後のコードをファイルに記録したものをオブジェクトファイルという。
ソースコードから変換してすぐのオブジェクトファイルはそのまま起動・実行可能なファイル形式とは限らず、多くの場合はリンカなどのソフトウェアによってライブラリなど他のオブジェクトファイルを連結したり、起動用のコードを先頭に付加するなどして、単体で実行可能なファイル(実行ファイル、ロードモジュールなどを呼ばれる)を作成する。
実行ファイル生成
あとはリンクして実行ファイルを生成すれば完了です。
$ g++ -o a.out main.o sample.o
. |--- sample.hpp |--- sample.cpp |--- sample.o |--- main.cpp |--- main.o |--- a.out
このa.out
が最終的な実行ファイルで、以下のようにコマンドを打つと実行できるはずです。
$ ./a.out Hello, World!
ソースコードから実行ファイルを生成する
.o
を毎回生成するのも面倒ですが、以下のようなコマンドを打てばソースコードから一気に実行ファイルが生成されます。
$ g++ main.cpp sample.cpp
CMakeを使ったビルド
CMake
を利用するには、CMakeLists.txt
というテキストを作成する必要があるそうです。
実行ファイルの生成
# CMakeのバージョン設定 cmake_minimum_required(VERSION 2.8) # a.outという実行ファイルをmain.cppとsample.cppから作成 add_executable(a.out main.cpp sample.cpp)
そうしたら以下のコマンドを打ち込みます。
$ cmake -S . -B build $ cmake --build build
無事に実行が終了するとbuild
フォルダが生成され、中にa.out
を出力されているはずです。
. |--- sample.hpp |--- sample.cpp |--- main.cpp |--- CMakeLists.txt |--- build |--- a.out |--- その他もろもろ
静的ライブラリの作成
# CMakeのバージョン設定 cmake_minimum_required(VERSION 2.8) #sample.cppから動的ライブラリを生成する add_library(mylib STATIC sample.cpp)
Mac
上では.a
が生成されました。
. |--- sample.hpp |--- sample.cpp |--- main.cpp |--- CMakeLists.txt |--- build |--- libmylib.a |--- その他もろもろ
動的ライブラリの作成
# CMakeのバージョン設定 cmake_minimum_required(VERSION 2.8) #sample.cppから動的ライブラリを生成する add_library(mylib SHARED sample.cpp)
Mac
上では.dylib
が生成されました。
. |--- sample.hpp |--- sample.cpp |--- main.cpp |--- CMakeLists.txt |--- build |--- libmylib.dylib |--- その他もろもろ
ひとこと
今回は本当に触りの部分しかできていませんが、一応iOS
用のstatic library
作成あたりもやりたいと思っているのでまた関連の記事を書くかもです。