2020年に書き直したものはこちら
プロジェクト名の変数化
プロジェクト名を変数化しておくといろいろと便利。set(変数名 値)
で変数を定義できる。
cmake_minimum_required(VERSION 2.8)
set(PROJ_NAME hello)
add_executable(${PROJ_NAME}
${PROJECT_SOURCE_DIR}/main.cpp
)
include(CheckCXXCompilerFlag)
でコンパイラフラグチェックを有効化
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
if(COMPILER_SUPPORTS_CXX14)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
else()
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.")
endif()
pkg-configによるモジュールの追加
find_package(PkgConfig)
でpkg-configを有効化
find_package(PkgConfig)
pkg_check_modules(OPENCV REQUIRED opencv)
pkg_check_modules(LIBAV REQUIRED libavcodec libavfilter libavformat libavutil libavdevice libavformat libavresample)
この例ではOpenCV関連の変数のプリフィックスがOPENCV_
となる。インクルードディレクトリはOPENCV_INCLUDE_DIRS
、ライブラリはOPENCV_LIBRARIES
としてアクセスできるようになる。
LIBAVのように複数のパッケージをまとめて検索することもできる
INCLUDE_DIRECTORIES
のように変数にパスを設定しておき、include_directories
で登録する。
set(INCLUDE_DIR
${OPENCV_INCLUDE_DIRS}
${QT4_INCLUDE_DIRS}
${PROJECT_SOURCE_DIR}/include
)
include_directories("${INCLUDE_DIR}")
ここによると、
次にようにINCLUDE_DIRECTORIES
変数に設定することでもできるらしい。
set(INCLUDE_DIRECTORIES
${PROJECT_SOURCE_DIR}/../include
)
追加のライブラリ(dll)
LIBRARIES
のように変数にライブラリを設定しておき、target_link_libraries
で登録する。
set(LIBRARIES
${LIBAV_LIBRARIES}
${QT4_LIBRARIES}
-lrt
-lpthread)
target_link_libraries(${PROJ_NAME} ${LIBRARIES})
pkg-configの変数や、-lrt
のように個別に設定することもできる。
追加のライブラリ(static)
DLLの場合同様にSTATIC_LIBRARIES
のように変数に登録しておき、target_link_libraries
で登録する。
set(STATIC_LIBRARIES
${PROJECT_SOURCE_DIR}/prebuilt_lib/libsdi.a
${PROJECT_SOURCE_DIR}/prebuilt_lib/libgdi.a
jpegdecdrv
)
target_link_libraries(${PROJ_NAME} ${STATIC_LIBRARIES})
ビルド済みのバイナリをリンクする場合は、ライブラリまでのフルパスを書く。
ソースからコンパイルする場合は、jpegdecdrv
のようにライブラリ名のみ記述すると、パスの解決などをCMakeがやってくれる。
DLLとスタティックを同時にリンク
DLLとスタティックなライブラリを同時にリンクしたい場合は、次のように同時に設定できる。
target_link_libraries(${PROJ_NAME} ${LIBRARIES} ${STATIC_LIBRARIES})
実行ファイルの生成
CMakeで実行形式を生成したい場合は、add_executable(実行ファイル名 ソースファイル名)
で設定する。
add_executable(${PROJ_NAME}
${PROJECT_SOURCE_DIR}/main.cpp
)
一つのCMakeLists.txtに複数add_executableを書くこともできる。
add_executableにhello.S
などアセンブラのソースファイルを登録したい場合は、予め有効化しておく必要がある。
enable_language(ASM)
add_executable(${PROJ_NAME}
${PROJECT_SOURCE_DIR}/main.c
${PROJECT_SOURCE_DIR}/hello.S
)
ライブラリなどのサブモジュールを一緒にビルドする場合、1つのCMakeLists.txtに全て定義することもできるが、
従来のMakefileのようにディレクトリごとにCMakeLists.txtを置くこともできる。
その場合はadd_subdirectory(ディレクトリ名)
で登録する。
add_subdirectory(libhello)
add_subdirectory(libbye)
スタティックライブラリの生成
スタティックライブラリをビルドする場合はadd_library
にSTATIC
を設定する。
add_library(hello STATIC
hello.cpp
hello_func.cpp
)
この例ではlibhello.a
が生成される。
CXX_FLAGSの設定
CXX_FLAGSなどの一般的に変数に関してはCMAKE_CXX_FLAGS
のように予め定義してある。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__ARMV8")