szmlb.net

tips for robotics

CMakeメモ

!昔のブログからの加筆転載

ROSを触っていて, CMakeで躓いている自分がいたので, まずCMakeを勉強することにした.

Learning CMake
http://www.wakayama-u.ac.jp/~chen/cmake/cmake.html

を参考にして一通り勉強した.
OpenGL, Qt, OpenCVとリンクしてビルドする例が載っているので, 理解を深めることができた.
ここでは, CMakeListsの書き方についてまとめておく.

CMakeListsの書き方まとめ

パスを指定して書く

  • ソースファイル

add_executable
add_executable(myapp src1.cpp src2.cpp)

ソースファイルは変数に一度に入れておく.

  • インクルードパス

include_directories
include_directories(/path/to/include)

CMakeLists.txt中のどこに置いても有効。

  • ライブラリパス

link_directories
link_directories(/path/to/lib)

それ以降に作成されたターゲットに対してのみ有効.

  • オプションの指定

set(CMAKE_CXX_COMPILER "/usr/bin/clang++") # C++コンパイラ指定
set(CMAKE_CXX_FLAGS "-Wall -std=c++HOGE") # コンパイルオプションの指定
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -ggdb") # デバッグモードのオプション
set(CMAKE_CXX_FLAGS_RELEASE "-O3") # リリースモードのオプション

  • ライブラリ

target_link_libraries
target_link_libraries(myapp foo)

ターゲット作成後でないと指定できない.
呼ぶ順番はとりあえず以下のようにしておけばよい.

cmake_minimum_required(VERSION 2.8)
add_definitions(-Dhoge -Dhogege)
include_directories(/path1/to/include /path2/to/include)
link_directories(/path1/to/lib /path2/to/lib)

set(CMAKE_CXX_FLAGS "-g -Wall -O3 -std=c++HOGE") # コンパイルオプションの指定
#デバッグ/リリース区別して書きたい場合は下記の通り
#set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -ggdb") # デバッグモードのオプション
#set(CMAKE_CXX_FLAGS_RELEASE "-O3") # リリースモードのオプション

add_executable(myapp main.cpp sub1.cpp)
target_link_libraries(hoge hogege)

また、include_directories、link_directories、target_link_librariesは複数回使って追加することができる.
target_link_libraries()は, -lmや-lglutなどの-l(hoge)の(hoge)の部分を入れる.
add_definitionsには-Dhogeをそのまま入れる.

find_packageを使う

find_package(HOGE REQUIRED)

という記述を使えば, ライブラリへのリンクやインクルードパスの追加が楽になる.

/usr/share/cmake-2.8/Modules の中身を見てfind_packageで探せるライブラリを確認して見ると,

$ls /usr/share/cmake-2.8/Modules | less

FindALSA.cmake
FindASPELL.cmake
FindAVIFile.cmake
FindArmadillo.cmake
FindBISON.cmake
FindBLAS.cmake
FindBZip2.cmake
FindBoost.cmake
FindBullet.cmake
FindCABLE.cmake
FindCUDA
FindCUDA.cmake
FindCURL.cmake
FindCVS.cmake
FindCoin3D.cmake

...

色々出てきた.

冒頭の参考サイトの例題prog6のCMakeListsを引用すると下記の通り.

cmake_minimum_required (VERSION 2.6)

project(prog6)

find_package(GLUT)
find_package(OpenGL)

set(CMAKE_CXX_FLAGS "-g -Wall")

add_executable(prog6 prog6.cc)
target_link_libraries(prog6 ${GLUT_LIBRARY} ${OPENGL_LIBRARY} m)

find_packageを使えば, 陽にパスを指定せず, インクルードディレクトリの指定も不要になるっぽいです.

コンパイル

cmake ./
#デバッグ/リリース区別する場合は下記の通り
cmake -DCMAKE_BUILD_TYPE=Debug ./ # デバッグモードのコンパイルオプションつかいたいときはこっち
cmake -DCMAKE_BUILD_TYPE=Release ./ # リリースモード
make

以上.