概要
MakefileとCMakeがどういうものなのか、C++で簡単なサンプルを使って理解する。
<サンプル内容>
test1:シンプルにビルド
test2:Makefileを使ってビルド
test3:CMakeを使ってビルド
test1:シンプルにビルド
test1
└── foo.cpp
test1フォルダに、foo.cppファイルを作成する
#include <iostream>
int main(){
std::cout << "Hello world!\n";
}
コマンドからg++でビルドする。
実行ファイル(main)ができて、実行すると”Hello world”が表示される。
$ g++ foo.cpp -o main
$ ./main
Hello world!
コマンド実行後のフォルダ構成
test1
├── foo.cpp
└── main
とてもシンプル。
test2:Makefileを使ってビルド
test2
├── foo.cpp
└── Makefile
次はtest2フォルダに、foo.cppとMakefileを用意する。
(foo.cppは、test1と同じなので省略)
OBJS = foo.cpp
PROG = main
$(PROG):
g++ $(OBJS) -o $(PROG)
コマンドからmakeと打つことで、Makefileが実行される。
できあがったmain(実行ファイル)を実行すると、”Hello world”が表示される。
$ make
$ ./main
Hello world!
コマンド実行後のフォルダ構成
test2
├── foo.cpp
├── Makefile
└── main
makefileは別にビルド専用ではないのでいろいろ使える(意外と便利)
test3:CMakeを使ってビルド
test3
├── foo.cpp
├── CMakeLists.txt
└── build
test3フォルダに、foo.cppとCMakeLists.txtを用意する。
test3フォルダに、buildフォルダを作成する。
(buildフォルダは、ビルドの結果できる生成物を格納するためのフォルダ。
なお、foo.cppは、test1/test2と同じ。)
cmake_minimum_required(VERSION 3.10)
project(test3 CXX)
add_executable(main foo.cpp)
コマンドからbuildフォルダに移動して、cmake ..を実行する。
上の階層のCMakeLists.txtの内容に従って、buildフォルダにmakefileが作成される。
次にmakeを実行すると、作成されたmakefileを使ってビルド実行する。
最後に実行ファイル(main)を実行すると、”Hello world”が表示される。
$ cd build
$ cmake ..
$ make
$ ./main
Hello world!
コマンド実行後のフォルダ構成(ビルドフォルダには、他にもファイルできる)
test3
├── foo.cpp
├── CMakeLists.txt
└── build
├── makefile
└── main
<ポイント>
・CMakeは、MakeLists.txtの内容に従って、実行環境にあわせたmakefileを作る。
・CMakeしたあとに、makefileを実行させるので、makeが必要になる。
この辺りが、よくわかっていなかった。
オプションなどがたくさんつくとわかりにくいが、理解すればシンプルかも。