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
とその依存ライブラリEigen
とglog
を利用
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
)