CMake эквивалентно таблицам свойств Visual Studio (.vsprops)

Я пытаюсь перейти с Visual Studio на Jetbrains ‘(круто) CLion IDE который использует CMake организовать проекты.

До сих пор переход был гладким: создание проектов CMake и импорт их в CLion — это легко, и я могу начать кодирование на одной платформе, а затем без проблем продолжить на другой.

Тем не менее, один аспект Visual Studio, который я не смог найти эквивалент в CMake это листы собственностиЯ использую их главным образом для хранения путей включаемых каталогов и библиотек ссылок для библиотек (т.е. один .vsprops файл для каждой библиотеки, например OpenCV.vsprops, 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" ...) ,

5

Решение

В CMake библиотеки могут экспортировать пакет с целевыми объектами IMPORTED, которые другие системы сборки импортируют с помощью find_package:

http://www.cmake.org/cmake/help/v3.1/manual/cmake-packages.7.html

http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html

http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#imported-targets

Вместо «ссылки на листы свойств» вы ссылаетесь на ИМПОРТИРОВАННЫЕ цели.

target_link_libraries(myTarget Dep1::Dep1 Dep2::Dep2)

Не все библиотеки создают ИМПОРТИРОВАННЫЕ цели, и не все предоставляют пакеты конфигурационных файлов cmake. В этих случаях (включая OpenCV и Boost), CMake предоставляет модули поиска:

http://www.cmake.org/cmake/help/v3.0/manual/cmake-developer.7.html#find-modules

который вы используете с find_package и ссылки на содержимое переменных.

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,

1

Кажется, это работает отлично, но могут быть проблемы, которые я не обнаружил. (Я волновался, что несколько макросов, добавляющих один и тот же target_link_libraries, могут вызвать «уже определенные» ошибки компоновки, но по крайней мере дескрипторы g ++ 5.1.0 получают одно и то же имя библиотеки несколько раз без ошибок.)

В корне CMakeLists.txt, ДО Вызовы add_subdirectory () или глобусы включают:

macro(USES_WX)
include_directories(SYSTEM /usr/local/include/wx-3.0)
include_directories(SYSTEM /usr/local/lib/wx/include/gtk3-unicode-3.0)
link_directories(/usr/local/lib)
add_definitions(-D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread)
target_link_libraries(${TARGET} pthread wx_gtk3u_xrc-3.0 wx_gtk3u_html-3.0 wx_gtk3u_qa-3.0 wx_gtk3u_adv-3.0 wx_gtk3u_core-3.0 wx_baseu_xml-3.0 wx_baseu_net-3.0 wx_baseu-3.0)
endmacro()

(Вы можете сделать макрос более интересным, например, проверить, является ли CMAKE_BUILD_TYPE «Отладка» или «Выпуск», чтобы ссылаться на соответствующие библиотеки, изменять определения препроцессора и т. Д. См. http://www.cmake.org/cmake/help/v3.0/command/if.html)

И пусть ваш проект CMakeLists.txt будет таким:

set(TARGET myProgramName)
add_executable(${TARGET} myProgramName.cpp)
USES_WX()

^^ вызов макроса ДОЛЖЕН быть после add_executable ()


И, если вы хотите поддержку нескольких целей, измените строку в корневом разделе CMakeLists.txt, показанную выше, чтобы:

    ...
target_link_libraries(${ARGV0} pthread wx_gtk3u_xrc-3.0 ...)
...

И пусть ваш проект CMakeLists.txt будет таким (меньше строк, но больше шансов на ошибку):

add_executable(myProgramName myProgramName.cpp)
USES_WX(myProgramName)
1
По вопросам рекламы [email protected]