cmake チートシート
[履歴] [最終更新] (2016/06/10 23:34:46)
1
作品
410
技術情報
最近の投稿
ここは
趣味の電子工作を楽しむ人のためのハードウェア情報共有サイト

技術情報や作品の投稿機能、リアルタイム遠隔操作 API をご利用いただけます。
新着作品

概要

cmake の簡単な使い方をまとめます。

参考 URL

よく使う周辺コマンド

project

プロジェクト名を指定します。

project( gtest_main )

PROJECT_NAME で参照できます。

add_executable(${PROJECT_NAME} main.cpp)

cmake_minimum_required

CMakeLists.txt の一番最初に記載します。project() コマンドよりも前である必要があります。最低限必要な cmake のバージョンを指定します。

cmake_minimum_required(VERSION 2.8)

message

変数をコンソールに出力できます。CMakeLists.txt のデバッグ時に便利です。

message("hi")
find_library(gtest NAMES libgtest.a PATHS googletest-master/googletest)
message(${gtest})

CMAKE_VERBOSE_MAKEFILE

出力情報を増やして cmake デバッグしやすくします。

set(CMAKE_VERBOSE_MAKEFILE TRUE)

ビルド成果物の出力先を指定

set(EXECUTABLE_OUTPUT_PATH build)

コンパイルオプションの指定

add_executable(Main src/main.cpp)
target_compile_options(Main PRIVATE "-Wall")

ヘッダーファイルのインクルード (-I)

target_include_directories

add_executable(gtest_main main.cpp)
target_include_directories(gtest_main PRIVATE googletest-master/googletest/include)

静的また動的ライブラリのインクルード (-L および -l)

静的ライブラリ 動的ライブラリ 実行ファイル
Unix .a .so 無し
Windows .lib .dll .exe
ビルド方法 add_library(archive STATIC archive.cpp zip.cpp) add_library(archive SHARED archive.cpp zip.cpp) add_executable(zipapp zipapp.cpp)

関連知識

  • ライブラリの静的リンクと動的リンク
  • libxxx.so/a という静的または動的ライブラリを g++ などで指定するときは "lib" を除外して xxx で参照します。
  • cmake の文法では .so.a の扱いはほぼ同じです。

In the context of the buildsystem definition as a whole, it is largely irrelevant whether particular libraries are SHARED or STATIC - the commands, dependency specifications and other APIs work similarly regardless of the library type.
https://cmake.org/cmake/help/v3.6/manual/cmake-buildsystem.7.html

find_library で絶対パスを取得してからリンクを追加します。

add_executable(Main src/main.cpp)

find_library(gtest NAMES libgtest.a PATHS googletest-master/googletest)
find_library(gtest_main NAMES libgtest_main.a PATHS googletest-master/googletest)

target_link_libraries(Main ${gtest})
target_link_libraries(Main ${gtest_main})

その他、気にすべきこと

target_xxx_yyy

target_xxx_yyy は指定した target にのみ影響します。xxx_yyy はその他の処理にも影響を与えるため target_xxx_yyy の使用が推奨されます。

The target_include_directories(), target_compile_definitions() and target_compile_options() commands have an effect on only one target at a time. The commands add_definitions(), add_compile_options() and include_directories() have a similar function, but operate at directory scope instead of target scope for convenience.
https://cmake.org/cmake/help/v3.6/manual/cmake-buildsystem.7.html

link_libraries よりも target_link_libraries の使用が推奨されます。

The target_link_libraries() command should be preferred whenever possible.
https://cmake.org/cmake/help/v3.6/command/link_libraries.html

aux_source_directory

aux_source_directory を使用すると、ディレクトリ配下のファイル一覧が取得できますが、これをビルド対象に設定することは非推奨です。

it is tempting to use this command to avoid writing the list of source files for a library or executable target. While this seems to work, there is no way for CMake to generate a build system that knows when a new source file has been added. Normally the generated build system knows when it needs to rerun CMake because the CMakeLists.txt file is modified to add a new source. When the source is just added to the directory without modifying this file, one would have to manually rerun CMake to generate a build system incorporating the new file.
https://cmake.org/cmake/help/v3.6/command/aux_source_directory.html

プロジェクト外の静的または動的ライブラリを利用するときには link_directories を使用することもできますが find_library を利用することもできます。

Note that this command is rarely necessary. Library locations returned by find_package() and find_library() are absolute paths. Pass these absolute library file paths directly to the target_link_libraries() command. CMake will ensure the linker finds them.
https://cmake.org/cmake/help/v3.6/command/link_directories.html

方法 1

add_executable(${PROJECT_NAME} src/main.cpp)

find_library(gtest NAMES libgtest.a PATHS googletest-master/googletest)
find_library(gtest_main NAMES libgtest_main.a PATHS googletest-master/googletest)

target_link_libraries(${PROJECT_NAME} ${gtest})
target_link_libraries(${PROJECT_NAME} ${gtest_main})

方法 2

add_executable よりも前に link_directories を指定します。

link_directories(${CMAKE_SOURCE_DIR}/googletest-master/googletest)
add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} gtest gtest_main)

相対パスを用いて指定すると警告が表示されます。

CMake Warning (dev) at CMakeLists.txt:13 (link_directories):
  This command specifies the relative path

    googletest-master/googletest

  as a link directory.

  Policy CMP0015 is not set: link_directories() treats paths relative to the
  source dir.  Run "cmake --help-policy CMP0015" for policy details.  Use the
  cmake_policy command to set the policy and suppress this warning.
This warning is for project developers.  Use -Wno-dev to suppress it.

出力文に記載されているように、以下のようにすれば警告を抑制できます。

cmake_policy(SET CMP0015 OLD)
link_directories(googletest-master/googletest)
add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} gtest gtest_main)
関連ページ
    概要 Maven, sbt, cmake, make 等と同様に、ビルドツールとして有名な Gradle の基本的な使い方を、特に Java をビルド対象としてまとめます。2017/05/08 現在、Android における標準のビルドツールです。 参考ドキュメント 環境構築 Installation Creating New Gradle Builds
    概要 JHBuild は複数のソースパッケージの依存関係等を定義して、何らかの成果物をビルドするためのツールです。各ソースパッケージはモジュールとよばれます。モジュールのソースコードは Git や Subversion、FTP/Web サーバ上の zip、tar 等様々なものが利用できます。モジュールのビルドシステムとしては
    概要 ロボットアプリケーションの開発環境の一つ OpenRAVE (Open Robotics Automation Virtual Environment) の環境を構築するための手順を記載します。ここでは特に Debian9 を利用します。 インストール 依存パッケージ ビルドツール関連 sudo apt install git build-essential cmake
    概要 ロボットシステム開発のためのフレームワーク Robot Operating System (ROS) の環境構築および簡単な使い方について記載します。ここでは Debian9 を利用することにします。ROS は現行バージョン1 の Melodic Morenia ディストリビューションを扱います。 ROS 対応のロボット