CMake入門

CMake入門

目次

1 概要

3 CMakeのインストール

  • Download https://cmake.org/download/ から、お使いのOS用のものをダウンロードしてインストール
    • 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_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の用意

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. 方法1
    • あるいは cmake .. でも動的ライブラリを生成したい場合CMakeLists.txtのadd_libraryを以下のようにしても良い
      • 静的ライブラリの場合は SHARED を STATIC におきかえ
    add_library(myadd SHARED myadd.cpp myadd.hpp)
    
  2. 方法2-1
    cmake -DBUILD_SHARED_LIBS=TRUE ..
    
  3. 方法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++でライブラリを作成し、それを利用した実行ファイルも作成

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の作成

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

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の作成

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

11.1 以下の操作を行っている動画


11.2 外部にあるライブラリをリンクして実行ファイルを作成4 の手順

11.2.1 装備されているリストを確認

cmake --help-module-list

11.2.2 C++ソース example.cpp 作成

11.2.3 CMakeの設定ファイル CMakeLists.txt 作成

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等)

12.1 CやC++の指定方法

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++のコンパイラー指定

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の章追加

著者: NM Max

Created: 2021-05-26 水 04:21

Validate