OpenCVを利用した単純なCMakeプロジェクトの作成方法 (C++)
本ページではOpenCVを利用した単純なアプリを作成する場合のCMakeファイルを解説します。利用言語はC++です。
環境:
OpenCV 4.6
CMake 3.16.3
Ubuntu 20.04
方法#
以下のようなディレクトリ構成の場合。
./
+--- CMakeList.txt
+--- src/
| +--- main.cpp
+--- include/
+--- header.h
CMaekLists.txt の中身を以下のようにします。
cmake_minimum_required(VERSION 3.4.3)
set(PROJECT_NAME opencv_app)
project(${PROJECT_NAME} LANGUAGES CXX)
set(SRC_FILES
"src/main.cpp")
set(HEADER_FILES
"include/header.h")
list(APPEND CMAKE_MODULE_PATH
"${CMAKE_SOURCE_DIR}/cmake")
# OpenCVのパッケージを見つける
find_package(OpenCV REQUIRED)
# OpenCVのインクルードファイルの場所を設定
include_directories(${OpenCV_INCLUDE_DIRS})
# 実行ファイル生成コマンド
add_executable("${PROJECT_NAME}" "${SRC_FILES}" "${HEADER_FILES}")
# OpenCVのライブラリを設定する (add_executableの後でなければならない)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBRARIES})
説明#
CMakeではこの手の find_package を利用して外部ライブラリを利用することが多々あります。ほかのパッケージでも大体の場合で通用はするかと思います。
find_package#
find_package はその名の通りパッケージを見つけてくるコマンドです。引数をすべて示すと以下になります。
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[GLOBAL]
[NO_POLICY_SCOPE]
[BYPASS_PROVIDER])
ここでは必要最低限のものだけ解説させていただきます。
オプション名 | 説明 |
---|---|
PackageName | 必要なパッケージの名称 |
version | 必要なバージョンを示すことが可能 |
REQUIRED | 存在しなければビルドができないときに設定する |
今回の例では利用していませんが、 version を利用することでパッケージ作成時に利用するライブラリのバージョンを指定することができます。OpenCVなどは古いバージョンをそのまま利用しているユーザもいるため、明示しておいた方が無難かもしれません。
include_directories#
include_directories はコンパイラに対してインクルードファイルを指定するコマンドです。
本コマンドに指定している OpenCV_INCLUDE_DIRS は find_package に成功した場合に自動的に生成される変数で、OpenCVのヘッダへのパスが格納されています[1] 。
target_link_libraries#
target_link_libraries はコンパイラに対して、生成対象の実行ファイルにリンクが必要なライブラリを指定するコマンドです。
本コマンドに指定している OpenCV_LIBS は find_package に成功した場合に自動的に生成される変数です[1] 。
この変数を見てみると、すべてのライブラリが列挙されているようですがコンパイラが依存関係を見て必要なものだけリンクしてくれているようです。 (生成したファイルを ldd コマンドで見ることで判断しました)
ソースからビルドしているならば、サンプルが存在する#
もしソースからビルドしてインストールしている場合、これらのCMakeList.txtのサンプルが同梱されています。
パッケージ内の samples/cpp/example_cmake/CMakeLists.txt などを参照してみてください。