ライブラリのインクルード/リンクを 1 行のコマンドにしたいので、CMake に関する私の (基本的な) 知識の範囲では、ある程度妥協する必要があると思います。主に、ターゲット名の変数をCMakeLists.txt
と「プロパティシート」。これが私の解決策です...誰かがよりシンプルでクリーンなものを提案するまで:
- CMake プロパティ シートは
.cmake
テキスト ファイルです。
- よく知られている変数名--
TARGET
-- はターゲット (すなわち の最初の引数add_executable()
) を指定します。
- ライブラリ固有のコマンドとは別に、ファイルにはおよびへ
.cmake
の呼び出しが含まれています。target_include_directories(${TARGET} PRIVATE ${PATH_TO_INCLUDE_DIR})
target_link_libraries(${TARGET} ${LIST_OF_LIBS})
- ライブラリに対して使用/リンクするには、 を呼び出し
include("path/to/.cmake")
ますCMakeLists.txt
。
次のファイルを使用して、X11 と OpenCV を使用する簡単なプログラムを正常にビルドして実行しました。
x11.cmake
target_include_directories(${TARGET} PRIVATE "/usr/include/X11")
target_link_libraries(${TARGET} "/usr/lib/x86_64-linux-gnu/libX11.so")
opencv.cmake
# OpenCV-specific stuff
set(OpenCV_DIR "/PATH/TO/OPENCV/INSTALL/DIR/share/OpenCV") # path to OpenCVConfig.cmake
find_package(OpenCV REQUIRED)
# include path
target_include_directories(${TARGET} PRIVATE ${OpenCV_INCLUDE_DIRS})
# linking libs
target_link_libraries(${TARGET} opencv_world opencv_ts)
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.4)
project(hello_clion)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
## hello-clion ##############################
# make a new target name
set(TARGET hello-clion)
# find sources
file(GLOB_RECURSE SOURCE_FILES "src/*.cpp" "src/*.hpp")
# declare a target
add_executable(${TARGET} ${SOURCE_FILES})
# link the libraries (to the last-declared ${TARGET}, which should be the last-added executable)
include("x11.cmake")
include("opencv.cmake")
#############################################
main.cpp
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <thread>
#include <opencv2/opencv.hpp>
#include <Xlib.h>
int main_x11()
{
// adapted from: http://rosettacode.org/wiki/Window_creation/X11#Xlib
}
int main_ocv()
{
// adapted from: http://docs.opencv.org/doc/tutorials/introduction/display_image/display_image.html#source-code
}
int main()
{
using namespace std;
thread tocv(main_ocv);
thread tx11(main_x11);
tocv.join();
tx11.join();
return 0;
}
これで、プロジェクト/プログラムで OpenCV を使用するたびにinclude("opencv.cmake")
、対応するCMakeLists.txt
.