5

Visual Studio から、 CMakeを使用してプロジェクトを整理するJetbrains の (素晴らしい) CLion IDEに移行しようとしています。

これまでのところ、移行はスムーズでした。CMake プロジェクトを作成して CLion にインポートするのは簡単で、あるプラットフォームでコーディングを開始してから、別のプラットフォームで問題なく続行できます。

ただし、CMake で同等のものを見つけることができなかった Visual Studio の 1 つの側面は、プロパティ シートです。主に、インクルード ディレクトリのパスとライブラリのリンク ライブラリを保持するために使用します (つまり、.vspropsライブラリごとにOpenCV.vsprops1つのファイルBoost.vsprops。等。)。

このように、VS では、.vsprops毎回パス/ライブラリを構成することなく、異なるプロジェクト間でライブラリのファイルを共有できました。

CMake には、Visual Studio のプロパティ シートと同様のメカニズムがありますか? ライブラリのインクルード/ライブラリをCMake解析可能なファイルに保存し、それを CMakeLists.txt に「インポート」してライブラリにリンクするにはどうすればよいですか?

基本的に、私がやりたいことは次のとおりです。

  1. 特定のライブラリの「cmake プロパティ シート」を作成します (より適切な名前がないため)。
  2. 次に、CMakeLists.txt に のように記述しますlink_target_to_libs(myTarget "path/to/propertySheet1" "path/to/propertySheet2" ...)
4

3 に答える 3

1

ライブラリのインクルード/リンクを 1 行のコマンドにしたいので、CMake に関する私の (基本的な) 知識の範囲では、ある程度妥協する必要があると思います。主に、ターゲット名の変数CMakeLists.txtと「プロパティシート」。これが私の解決策です...誰かがよりシンプルでクリーンなものを提案するまで:

  1. CMake プロパティ シート.cmakeテキスト ファイルです。
  2. よく知られている変数名-- TARGET-- はターゲット (すなわち の最初の引数add_executable()) を指定します。
  3. ライブラリ固有のコマンドとは別に、ファイルにはおよびへ.cmakeの呼び出しが含まれています。target_include_directories(${TARGET} PRIVATE ${PATH_TO_INCLUDE_DIR})target_link_libraries(${TARGET} ${LIST_OF_LIBS})
  4. ライブラリに対して使用/リンクするには、 を呼び出し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.

于 2015-02-07T14:19:57.037 に答える