CMakeについてのメモ [Memo #002]

Table of Contents

CV・CG系のライブラリはCMakeを使って開発されていることが多く、今後CMakeを頻繁に利用することが考えられるため、その使い方をまとめておく

CMakeの仕組み


C/C++のビルドの仕組みとライブラリの使用方法

参考サイト(1):https://qiita.com/seriru13/items/c2f5192615162c4c3f47
参考サイト(2):https://kamino.hatenablog.com/entry/c%2B%2B-principle-of-build-library

コマンドラインでのビルドとCMakeでのビルドを比較

参考サイト(3):https://qiita.com/shohirose/items/45fb49c6b429e8b204ac

  • 実行ファイルの作成
  • 静的・共有ライブラリの作成
  • サブディレクトリのソース

参考サイト(4):https://qiita.com/shohirose/items/637f4b712893764a7ec1

  • コンパイルオプションの設定
  • ビルドタイプの指定
  • ジェネレーター式
  • ライブラリのリンク

参考サイト(5):https://qiita.com/shohirose/items/d2b9c595a37b27ece607

  • 他のライブラリの利用

実際にCMakeを利用する

参考サイト(6):https://kamino.hatenablog.com/entry/cmake_tutorial1

  • CMakeのインストール
  • Configurate & Generate
  • ビルド
  • デバッグ

参考サイト(7):https://kamino.hatenablog.com/entry/cmake_tutorial2

  • 階層化

参考サイト(8):https://kamino.hatenablog.com/entry/cmake_tutorial3

  • CMakeプロジェクトの設定
  • ビルドタイプの設定

参考サイト(9):https://kamino.hatenablog.com/entry/cmake_tutorial4

  • find_package
  • 外部ライブラリの利用

外部ライブラリ利用の手順

例として、数理最適化ライブラリceres-solverとその依存ライブラリEigenglogを利用

Eigenのインストール

EigenのGitHubリポジトリをクローン

手動インストールのためC:\lib\eigen3.3.7にビルド

(git clone https://github.com/eigenteam/eigen-git-mirror.git)※今回はsourcetreeを利用
cd eigen-git-mirror
git checkout 3.3.7
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX='C:/lib/eigen3.3.7'
cmake --build . --target install
Glogのインストール

GlogのGitHubリポジトリをクローン

手動インストールのためC:\lib\glog0.4.0にビルド

(git clone https://github.com/eigenteam/eigen-git-mirror.git)※今回はsourcetreeを利用
cd eigen-git-mirror
git checkout 3.3.7
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX='C:/lib/eigen3.3.7'
cmake --build . --target install
Configファイル(Config.cmake)のパスを通す

Configファイルはだいたい~/cmake/の中に用意されている

find_package()から発見できるようにするには、

後のビルド時に-DCMAKE_PREFIX_PATH='C:/lib/eigen3.3.7/;C:/lib/glog0.4.0'を追加

ceres-solverのインストール

ceres-solverのGitHubリポジトリをクローン
mainブランチだとエラーが発生するため、use-find-packageブランチをクローン)

仮インストールのためceres-solver/build_dir/install_dirにビルド

(git clone https://github.com/ceres-solver/ceres-solver)※今回はsourcetreeを利用
cd ceres-solver
mkdir build_dir
cd build_dir

cmake .. -DCMAKE_INSTALL_PREFIX='install_dir' -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF
cmake --build . --target install

このビルド時に-DCMAKE_PREFIX_PATH='C:/lib/eigen3.3.7/;C:/lib/glog0.4.0'もしくは-DCMAKE_MODULE_PATH='C:/lib'を追加

サンプルプロジェクトの作成

ceres-solverを利用するCMakeプロジェクトを作成する

ここでCeresConfig.cmakeを利用してリンクをする

cmake_minimum_required(VERSION 3.1)

project(findpackage_sample CXX)

find_package(Ceres REQUIRED)

add_executable(main_app main.cpp)

target_link_libraries(main_app ${CERES_LIBRARIES})

if(MSVC AND ${MSVC_VERSION} GREATER_EQUAL 1915)
  target_compile_definitions(main_app PRIVATE _ENABLE_EXTENDED_ALIGNED_STORAGE)
endif()

${CERES_LIBRARIES}にはCeresConfig.cmakeが作成したターゲットceresが入る
これをmain_appにリンクするだけで設定が完了する

ターゲットceresに対しては、インクルードディレクトリの指定target_include_directories()などのコマンドで依存ターゲットへのインクルードやリンクの設定が行われている

mkdir build
cd build
cmake .. -DCeres_DIR='<path to directory of CeresConfig.cmake>'
cmake --build .

<path to directory of CeresConfig.cmake>ではCeresConfig.cmakeがあるフォルダをフルパスで指定する
(例えば~~~\ceres-solver\build_dir\install_dir\CMake

main_appを実行して確認