CMake入門
目次
- 1. 概要
- 2. 関連文書
- 3. CMakeのインストール
- 4. C++ソースから実行ファイルの作成(シンプル)
- 5. C++でライブラリの作成
- 6. C++でライブラリを作成し、それを利用した実行ファイルも作成
- 7. 外部にあるライブラリをリンクして実行ファイルを作成1
- 8. 外部にあるライブラリをリンクして実行ファイルを作成2
- 9. 外部にあるライブラリをリンクして実行ファイルを作成2
- 10. 外部にあるライブラリをリンクして実行ファイルを作成3
- 11. 外部にあるライブラリをリンクして実行ファイルを作成4
- 12. C++の指定(C++11,C++14,C++17,C++20,C++23等)
- 13. CやC++のコンパイラー指定
- 14. 今後
- 15. この文書のチェンジログ
1 概要
- ビルドツール
- Wikipediaにわかりやすいまとめありhttps://ja.wikipedia.org/wiki/CMake
2 関連文書
- 本家 https://cmake.org/
- GitHub https://github.com/Kitware/CMake
- 本家以外の文書
- Cheat sheet https://github.com/mariokonrad/cmake-cheatsheet
- 類似のツール
- GNU Make (これが私の愛用ツール)
- Ant
- Maven
- Gradle
3 CMakeのインストール
- Download https://cmake.org/download/ から、お使いのOS用のものをダウンロードしてインストール
- Ubuntuなら以下のコマンドでインストール可能
- 他の必要なツールはhttps://youtu.be/SWNKrXFkJpoのDockerfileを参考に入れて下さい。
- Ubuntuなら以下のコマンドでインストール可能
sudo apt install cmake
- この動画のシリーズではhttps://youtu.be/SWNKrXFkJpoで作成したDocker Imageを利用していきます。(CMakeやC++コンパイラ、その他必要なものはいっているため)
- どのOSでもDockerを利用して同じ操作可能
- ご自分のOSに直接CMakeをインストールして、Docker使わずやってもOK。(ほぼ同じ手順となります。)
3.1 説明動画
3.2 この章のまとめ
- CMakeのインストール方法について説明
- ダウンロードサイトから、ダウンロードしてインストール
- どのOSでも共通で利用できる環境をDockerで解説してきます。
- Dockerの環境の準備が面倒なら、必要なツールをインストールして直接やってもよい
4 C++ソースから実行ファイルの作成(シンプル)
4.1 以下の操作を行っている動画
4.2 C++ソースから実行ファイルの作成の手順
4.2.1 Dockerイメージの起動
- ホストの/work/CMakeと、Dockerイメージ内の/home/user/Cディレクトリを共有するコマンドで起動
- Dockerイメージはhttps://youtu.be/SWNKrXFkJpoで作成したものを利用してます。Docker使わず、直接ご利用のOSにCMakeやコンパイラ入れてやってもOK
docker run -it --rm -v /work/CMake:/home/user/C mypybind11
4.2.2 C++ソースの用意
- Hello Worldと出力する例を作成
- ファイル名はhelloworld.cpp
#include <iostream> int main() { std::cout << "Hello world!" << std::endl; return 0; }
4.2.3 CMakeLists.txtの用意
- 最初の行がCMakeのバージョン指定 https://cmake.org/cmake/help/latest/command/cmake_minimum_required.html#command:cmake_minimum_required
- 2行目がプロジェクト名の指定 https://cmake.org/cmake/help/latest/command/add_executable.html
- 言語をC++に指定 (省略可能)
- バージョン番号も指定 (省略可能)
- 試しに、この行をコメントアウトすると、projectの宣言がないと怒られたが、ちゃんとコンパイルは出来た
- 3行目が実行ファイルを作成する指令 https://cmake.org/cmake/help/latest/command/add_executable.html
- 生成ファイル名と、元ソースを記述
cmake_minimum_required(VERSION 3.4...3.18) project(helloworld LANGUAGES CXX VERSION 1.0) add_executable(helloworld helloworld.cpp)
4.2.4 コンパイル
- ビルドするディレクトリに移動
mkdir build
cd build
- cmakeを実行
cmake ..
- GNU Makeを実行しコンパイル
make
4.2.5 動作確認
./helloworld
4.3 この章のまとめ
- 簡単なC++のソースファイルから実行ファイルをコンパイルして動かしてみた
5 C++でライブラリの作成
5.1 以下の操作を行っている動画
5.2 C++でライブラリの作成の手順
5.2.1 Dockerイメージの起動
- ホストの/work/CMakeと、Dockerイメージ内の/home/user/Cディレクトリを共有するコマンドで起動
- Dockerイメージはhttps://youtu.be/SWNKrXFkJpoで作成したものを利用してます。Docker使わず、直接ご利用のOSにCMakeやコンパイラ入れてやってもOK
docker run -it --rm -v /work/CMake:/home/user/C mypybind11
5.2.2 C++ソースの用意
- Hello Worldと出力する例を作成
- ファイル名はmyadd.hpp
int myadd(const int &i, const int &j);
- ファイル名はmyadd.cpp
- 2つの引数をうけとり、足して返す関数
int myadd(const int &i, const int &j) { return i+j; }
5.2.3 CMakeLists.txtの用意
- 3行目が前章と異なっている。ライブラリを作成する指令 https://cmake.org/cmake/help/latest/command/add_library.html#command:add_library
- 生成ファイル名と、元ソースを記述
cmake_minimum_required(VERSION 3.4...3.18) project(myadd LANGUAGES CXX) add_library(myadd myadd.cpp myadd.hpp)
5.2.4 コンパイル
- ビルドするディレクトリに移動
mkdir build
cd build
- cmakeを実行
cmake ..
- GNU Makeを実行しコンパイル
make
5.2.5 コンパイル2 動的ライブラリ作成
- 方法1
- あるいは cmake .. でも動的ライブラリを生成したい場合CMakeLists.txtのadd_libraryを以下のようにしても良い
- 静的ライブラリの場合は SHARED を STATIC におきかえ
add_library(myadd SHARED myadd.cpp myadd.hpp)
- あるいは cmake .. でも動的ライブラリを生成したい場合CMakeLists.txtのadd_libraryを以下のようにしても良い
- 方法2-1
- cmake .. のかわりに以下を実行すれば動的ライブラリを生成できる
cmake -DBUILD_SHARED_LIBS=TRUE ..
- 方法2-2
- add_library(myadd myadd.cpp myadd.hpp) の行の前にsetで、環境変数をセット
set(BUILD_SHARED_LIBS TRUE) add_library(myadd myadd.cpp myadd.hpp)
5.2.6 動作確認
- 動作確認は省略します。このライブラリを利用する実行ファイルを作成してみてください。
5.3 この章のまとめ
- 簡単なC++のソースファイルからライブラリをコンパイルして生成した。
6 C++でライブラリを作成し、それを利用した実行ファイルも作成
- 前の章で作成したライブラリを利用した実行ファイルも作成
- add_library https://cmake.org/cmake/help/latest/command/add_library.html#command:add_library
- BUILD_SHARED_LIBS https://cmake.org/cmake/help/latest/variable/BUILD_SHARED_LIBS.html#variable:BUILD_SHARED_LIBS
- set https://cmake.org/cmake/help/latest/command/set.html#command:set
- target_link_libraries https://cmake.org/cmake/help/latest/command/target_link_libraries.html#command:target_link_libraries
6.1 以下の操作を行っている動画
6.2 C++でライブラリの作成の手順
6.2.1 Dockerイメージの起動
- ホストの/work/CMakeと、Dockerイメージ内の/home/user/Cディレクトリを共有するコマンドで起動
- Dockerイメージはhttps://youtu.be/SWNKrXFkJpoで作成したものを利用してます。Docker使わず、直接ご利用のOSにCMakeやコンパイラ入れてやってもOK
docker run -it --rm -v /work/CMake:/home/user/C mypybind11
6.2.2 C++ソースの用意
- 前の章のファイルに追加して、main.cppを追加
#include "myadd.hpp" #include <iostream> int main() { std::cout << myadd(1,2) << std::endl; return 0; }
6.2.3 CMakeLists.txtの作成
- 4行目を追加
- add_executable(main main.cpp myadd) だと linkが myadd.cpp.o をリンクするようになる
- 5行目を追加 https://cmake.org/cmake/help/latest/command/target_link_libraries.html#command:target_link_libraries
- コンパイル時に必要なライブラリを記述
cmake_minimum_required(VERSION 3.4...3.18) project(myadd LANGUAGES CXX) add_library(myadd SHARED myadd.cpp myadd.hpp) add_executable(main main.cpp) target_link_libraries(main myadd)
6.2.4 コンパイル
- ビルドするディレクトリでコンパイル
- cmakeを実行
cmake ..
- GNU Makeを実行しコンパイル
make
6.2.5 動作確認
./main
6.3 この章のまとめ
- 前章のライブラリをリンクして実行ファイルを作成するように、ファイルを追加したり、修正した
7 外部にあるライブラリをリンクして実行ファイルを作成1
- link_directories https://cmake.org/cmake/help/latest/command/link_directories.html
- find_package https://cmake.org/cmake/help/latest/command/find_package.html
- message https://cmake.org/cmake/help/latest/command/message.html#command:message
- include_directories https://cmake.org/cmake/help/latest/command/include_directories.html#command:include_directories
- target_link_libraries https://cmake.org/cmake/help/latest/command/target_link_libraries.html#command:target_link_libraries
- CMAKE_VERBOSE_MAKEFILE https://cmake.org/cmake/help/latest/variable/CMAKE_VERBOSE_MAKEFILE.html#variable:CMAKE_VERBOSE_MAKEFILE
7.1 以下の操作を行っている動画
7.2 外部にあるライブラリをリンクして実行ファイルを作成1 の手順
7.2.1 Dockerイメージの起動
- ホストの/work/CMakeと、Dockerイメージ内の/home/user/Cディレクトリを共有するコマンドで起動
- Dockerイメージはhttps://youtu.be/SWNKrXFkJpoで作成したものを利用してます。Docker使わず、直接ご利用のOSにCMakeやコンパイラ入れてやってもOK
docker run -it --rm -v /work/CMake:/home/user/C mypybind11
7.2.2 C++ソースの用意
- 前の章のmain.cppはそのまま利用
7.2.3 CMakeLists.txtの作成
- 3行目を追加
- link_directories https://cmake.org/cmake/help/latest/command/link_directories.html
- link_directories は リンクすが必要な生成指令(今回だとadd_executable)より前で、後ろだとエラーになった
- 4行目を追加
- 5行目を追加
- 7行目を追加
- 8行目を追加
- CMAKE_VERBOSE_MAKEFILE https://cmake.org/cmake/help/latest/variable/CMAKE_VERBOSE_MAKEFILE.html#variable:CMAKE_VERBOSE_MAKEFILE
- これすると、Make時に何してるか詳しく情報出力されるので、CMakeLists.txtのデバッグしやすくなる
cmake_minimum_required(VERSION 3.4...3.18) project(ex004 LANGUAGES CXX VERSION 1.0) link_directories(../ex003/build/) find_library(myadd NAMES myadd PATHS ../ex003/build REQUIRED) message(${myadd}) add_executable(ex004 main.cpp) include_directories(../ex003/) target_link_libraries(ex004 PUBLIC myadd) #set(CMAKE_VERBOSE_MAKEFILE TRUE)
7.2.4 コンパイル
- ビルドするディレクトリに移動
mkdir build
cd build
- cmakeを実行
cmake ..
- GNU Makeを実行しコンパイル
make
7.2.5 動作確認
./main
7.3 この章のまとめ
- 外部の自作ライブラリを利用して、実行ファイルを作成するのをやってみた。(インクルードパスの設定と、外部ライブラリの指定)
8 外部にあるライブラリをリンクして実行ファイルを作成2
- mライブラリを使う例
- Dockerイメージはhttps://youtu.be/SWNKrXFkJpoで作成したものを利用してます。Docker使わず、直接ご利用のOSにCMakeやコンパイラ入れてやってもOK
8.1 以下の操作を行っている動画
8.2 外部にあるライブラリをリンクして実行ファイルを作成2 の手順
- C++ソース example.cpp
#include <cmath> #include <iostream> int main() { std::cout << "sin(1)=" << sin(1) << std::endl; std::cout << "sin(0)=" << sin(0) << std::endl; std::cout << "cos(1)=" << cos(1) << std::endl; std::cout << "cos(0)=" << cos(0) << std::endl; return 0; }
- CMakeの設定ファイル CMakeLists.txt
cmake_minimum_required(VERSION 3.4...3.18) project(ex006-01 LANGUAGES CXX VERSION 1.0) find_library(m NAMES m REQUIRED) message(${m}) add_executable(ex006-01 example.cpp) target_link_libraries(ex006 PUBLIC m) #set(CMAKE_VERBOSE_MAKEFILE TRUE)
- コンパイルは前章と同じ手順
8.3 この章のまとめ
- mライブラリを使う例をやってみた
9 外部にあるライブラリをリンクして実行ファイルを作成2
- mライブラリを使う例
- Dockerイメージはhttps://youtu.be/SWNKrXFkJpoで作成したものを利用してます。Docker使わず、直接ご利用のOSにCMakeやコンパイラ入れてやってもOK
9.1 以下の操作を行っている動画
9.2 外部にあるライブラリをリンクして実行ファイルを作成2 の手順
- C++ソース example.cpp
#include <cmath> #include <iostream> int main() { std::cout << "sin(1)=" << sin(1) << std::endl; std::cout << "sin(0)=" << sin(0) << std::endl; std::cout << "cos(1)=" << cos(1) << std::endl; std::cout << "cos(0)=" << cos(0) << std::endl; return 0; }
- CMakeの設定ファイル CMakeLists.txt
cmake_minimum_required(VERSION 3.4...3.18) project(ex006-01 LANGUAGES CXX VERSION 1.0) find_library(m NAMES m REQUIRED) message(${m}) add_executable(ex006-01 example.cpp) target_link_libraries(ex006 PUBLIC m) #set(CMAKE_VERBOSE_MAKEFILE TRUE)
- コンパイルは前章と同じ手順
9.3 この章のまとめ
- mライブラリを使う例をやってみた
10 外部にあるライブラリをリンクして実行ファイルを作成3
- OpenCVライブラリを使う例
- Dockerイメージはhttps://youtu.be/SWNKrXFkJpoで作成したものを利用してます。Docker使わず、直接ご利用のOSにCMakeやコンパイラ入れてやってもOK
10.1 以下の操作を行っている動画
10.2 外部にあるライブラリをリンクして実行ファイルを作成3 の手順
10.2.1 事前準備
- OpenCVライブラリのインストール
- 相当時間かかります。
sudo apt update sudo apt install libopencv-dev
10.2.2 C++ソース example.cpp 作成
- 実行時のカレントディレクトリにある1.jpgを読み込んで、2.pngとして書き出すプログラム
#include <opencv2/opencv.hpp> int main() { cv::Mat image = cv::imread( "1.jpg"); cv::imwrite("2.png",image); return 0; }
10.2.3 CMakeの設定ファイル CMakeLists.txt 作成
cmake_minimum_required(VERSION 3.4...3.18) project(ex006-2 LANGUAGES CXX VERSION 1.0) find_package( OpenCV REQUIRED ) include_directories( ${OpenCV_INCLUDE_DIRS} ) message(${OpenCV_INCLUDE_DIRS}) add_executable(ex006-2 example.cpp) target_link_libraries( ex006-2 ${OpenCV_LIBS} ) #set(CMAKE_VERBOSE_MAKEFILE TRUE)
- コンパイルは前章と同じ手順
10.3 この章のまとめ
- OpenCVライブラリを使う例をやってみた
11 外部にあるライブラリをリンクして実行ファイルを作成4
- Python3を利用する例をやってみる
- Dockerイメージはhttps://youtu.be/SWNKrXFkJpoで作成したものを利用してます。Docker使わず、直接ご利用のOSにCMakeやコンパイラ入れてやってもOK
11.1 以下の操作を行っている動画
11.2 外部にあるライブラリをリンクして実行ファイルを作成4 の手順
11.2.1 装備されているリストを確認
cmake --help-module-list
11.2.2 C++ソース example.cpp 作成
11.2.3 CMakeの設定ファイル CMakeLists.txt 作成
- https://cmake.org/cmake/help/git-stage/module/FindPython.html#module:FindPython を参考に作成
- https://cmake.org/cmake/help/latest/module/FindPython3.html
cmake_minimum_required(VERSION 3.4...3.18) project(ex006-3 LANGUAGES CXX VERSION 1.0) find_package (Python COMPONENTS Development REQUIRED ) include_directories( ${Python_INCLUDE_DIRS} ) message(${Python_INCLUDE_DIRS}) add_executable(ex006-3 example.cpp) target_link_libraries( ex006-3 ${Python_LIBRARIES} ) #set(CMAKE_VERBOSE_MAKEFILE TRUE) #set(CMAKE_VERBOSE_MAKEFILE TRUE)
- コンパイルは前章と同じ手順
11.3 この章のまとめ
- 標準装備のライブラリを使う例をやってみた
- ここではPython3
12 C++の指定(C++11,C++14,C++17,C++20,C++23等)
- CXX_STANDARD https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html#prop_tgt:CXX_STANDARD
- CXX_STANDARD_REQUIRED https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD_REQUIRED.html
- CXX_EXTENSIONS https://cmake.org/cmake/help/latest/prop_tgt/CXX_EXTENSIONS.html#prop_tgt:CXX_EXTENSIONS
- CMAKE_CXX_STANDARD https://cmake.org/cmake/help/latest/variable/CMAKE_CXX_STANDARD.html?highlight=cmake_cxx#variable:CMAKE_CXX_STANDARD
- CMAKE_CXX_STANDARD_REQUIRED https://cmake.org/cmake/help/latest/variable/CMAKE_CXX_STANDARD_REQUIRED.html
- CMAKE_CXX_EXTENSIONS https://cmake.org/cmake/help/latest/variable/CMAKE_CXX_EXTENSIONS.html?highlight=cmake_cxx#variable:CMAKE_CXX_EXTENSIONS
12.1 CやC++の指定方法
- CXX_STANDARD https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html#prop_tgt:CXX_STANDARD で指定する
- CMAKE_CXX_STANDARD https://cmake.org/cmake/help/latest/variable/CMAKE_CXX_STANDARD.html?highlight=cmake_cxx#variable:CMAKE_CXX_STANDARD CXX_STANDARD のデフォルト値を設定
- Supported values are 98, 11, 14, 17, 20, 23.
- This “decay” behavior may be controlled with the CXX_STANDARD_REQUIRED target property.
- CXX_STANDARD_REQUIRED https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD_REQUIRED.html
- CMAKE_CXX_STANDARD_REQUIRED https://cmake.org/cmake/help/latest/variable/CMAKE_CXX_STANDARD_REQUIRED.html CXX_STANDARD_REQUIRED のデフォルト値を設定
- Additionally, the CXX_EXTENSIONS target property may be used to control whether compiler-specific extensions are enabled on a per-target basis.
- CXX_EXTENSIONS https://cmake.org/cmake/help/latest/prop_tgt/CXX_EXTENSIONS.html#prop_tgt:CXX_EXTENSIONS
- CMAKE_CXX_EXTENSIONS https://cmake.org/cmake/help/latest/variable/CMAKE_CXX_EXTENSIONS.html?highlight=cmake_cxx#variable:CMAKE_CXX_EXTENSIONS CXX_EXTENSIONS のデフォルト値を設定
12.1.1 設定例
set(CMAKE_CXX_STANDARD 14) # C++14 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 満たせないならエラーに set(CMAKE_CXX_EXTENSIONS OFF) # コンパイラの独自拡張をOFFに
12.1.2 注意点
- project(XXX LANGUAGES CXX VERSION 0.01) という記述の前に上記の設定を行う必要あり。
- 言語指定する前に設定しておく必要あり
12.1.3 備考
- 設定ファイル内で指定しなくとも、cmake実行する時に環境変数を設定してもOK
12.2 この章のまとめ
- C++14やC++17等が必要なときの設定方法
13 CやC++のコンパイラー指定
- CMAKE_C_COMPILER,CMAKE_CXX_COMPILER https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html
13.1 以下の操作を行っている動画
13.2 CやC++のコンパイラー指定
13.2.1 設定例1
- PATHが通っているところから探してくれる
set(CMAKE_C_COMPILER "clang") set(CMAKE_CXX_COMPILER "clang++")
13.2.2 設定例2
- フルパスで指定
set(CMAKE_C_COMPILER "/usr/bin/clang") set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
13.2.3 注意点
- project(XXX LANGUAGES CXX VERSION 0.01) という記述の前に上記の設定を行う必要あり。
- 言語指定する前に設定しておく必要あり
13.2.4 備考
- 設定ファイル内で指定しなくとも、cmake実行する時に環境変数を設定してもOK
13.3 この章のまとめ
- clang++やclang等デフォルトで選ばれるコンパイラ以外を選択したい場合の設定方法
14 今後
- 今後も文書追加していきます。
15 この文書のチェンジログ
- 2021/05/17 初版
- 2021/05/20 外部にあるライブラリをリンクして実行ファイルを作成1までの章かなり修正
- 2021/05/21 C++の指定(C++11,C++14,C++17,C++20,C++23等) の章、 CやC++のコンパイラー指定 の章追加
- 2021/05/24 外部にあるライブラリをリンクして実行ファイルを作成1の章追加
- 2021/05/25 外部にあるライブラリをリンクして実行ファイルを作成2から4の章追加
Created: 2021-05-26 水 04:21