Help us understand the problem. What is going on with this article?

cmake チュートリアルを読む前に

More than 3 years have passed since last update.

はじめに

簡単な設定ファイル(CMakeLists.txt)を書くだけでMakefileを生成してくれるcmakeはとても便利なものだけど、いまいち初心者には敷居が高い。
チュートリアルはあるけど、肝心なことが書いてなかったりもする。

この文章ではライブラリを使ったお試しコード用のMakefileをcmakeで簡単に作ることを目指す。

例題用コード

画面に800x600の白いウインドウを表示するだけのX11ライブラリを使った簡単なプログラムを用意した。
閉じるボタンを押しても死なないのはご愛嬌。

https://gist.github.com/maueki/40c6641a3815388246e7

CMakeLists.txt を書く

cmakeを使うためにはCMakeLists.txtを記述する必要がある。
上記のソースコードと同じディレクトリに以下のCMakeLists.txtを作成する。
(ディレクトリ名はtest_projectである必要はない)

CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project (test_project)
add_executable(create_window create_window.c)
find_package(X11 REQUIRED)
target_link_libraries(create_window ${X11_LIBRARIES})

3行目のadd_executablecreate_windowという実行形式の作成とそれにcreate_window.cというファイルが必要であることが記載されている。
4行目のfind_packageはビルドに必要なX11パッケージを使用する旨が記載されている。
5行目のtarget_link_librariesにはcreate_windowのリンクに必要なライブラリが記載されている。2番目の引数X11_LIBRARIESは4行目のfind_packageの際に取り込まれた変数で、X11ライブラリ一覧が記載されている。

CMakeLists.txtが書けたら同じディレクトリでcmakeを実行してMakefileを生成する。

$ cmake .

後ろのピリオド(カレントディレクトリを指定)を忘れずに。
あとはmakeを実行すれば、カレントディレクトリにcreate_windowというバイナリができる。

使用可能なパッケージを知るには

上記では使用するパッケージとしてX11を指定した。
使用できるパッケージの一覧はcmakeのモジュール一覧で確認できる。

$ cmake --help-module-list | grep -e '^Find'

さらにモジュールの詳細を以下のコマンドで確認できる。

$ cmake --help-module FindX11
cmake version 2.8.12.2
  FindX11
       Find X11 installation

       Try to find X11 on UNIX systems.  The following values are defined

         X11_FOUND        - True if X11 is available
         X11_INCLUDE_DIR  - include directories to use X11
         X11_LIBRARIES    - link against these to use X11
(snip)

パッケージにないライブラリを使用するには

パッケージにないライブラリ(例えばlibEGL.so)を使用するにはCMakeLists.txtに以下のように記載する。

CMakeLists.txt
find_library(EGL_LIBRARY NAMES EGL)
target_link_libraries(create_window ${X11_LIBRARIES} ${EGL_LIBRARY})

正式な方法としては自前パッケージ(FindEGL.cmake)を作成する方法がある。それについては以下を参照。
http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries

デバッグフラグを設定する

CMakeLists.txt
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g")

または

CmakeLists.txt
set_target_properties(create_window PROPERTIES COMPILE_FLAGS "-O0 -g")

さらに学ぶには

cmakeのチュートリアルがおすすめ。

本家: http://www.cmake.org/cmake/help/cmake_tutorial.html
日本語版: http://opencv.jp/cmake/cmake_tutorial.html

FAQ

複数の実行形式を作りたい。また実行形式毎に#defineの設定をおこないたい

http://stackoverflow.com/questions/9989574/how-to-build-a-program-with-2-different-values-of-a-variable-in-cmake

CMakeLists.txt
add_executable(myAppV1 main.cpp)
add_executable(myAppV2 main.cpp)
set_target_properties(myAppV1 PROPERTIES COMPILE_DEFINITIONS "BUILDTYPE=1")
set_target_properties(myAppV2 PROPERTIES COMPILE_DEFINITIONS "BUILDTYPE=2")

pkg-configを使いたい

CMakeLists.txt内でfind_package(PkgConfig)を呼ぶことによってpkg_check_modulesコマンドを利用することができる。
このコマンドはpkg-configを呼び出し、その結果を利用する。

利用例

CMakeLists.txt
find_package(PkgConfig)
pkg_check_modules(SQLITE3 REQUIRED sqlite3)
target_link_libraries(sqlite3_test ${SQLITE3_LIBRARIES})

参照

$ cmake --help-module FindPkgConfig

PKG_CONFIG_PATHを設定する

cmake 3.1未満

set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/path/to/pkgconfig")

cmake 3.1以降

set(PKG_CONFIG_PATH ${PKG_CONFIG_PATH} /path/to/pkgconfig)

オプションをコマンドラインで設定したい

例えばGLFW_USE_EGLというオブションをONにしたい場合

$ cmake -DGLFW_USE_EGL=ON .

参照
http://stackoverflow.com/questions/5998186/cmake-adding-command-line-options

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away