Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Система построения проектов CMake. Учебник.pdf
X
- •Введение
- •Модульное программирование
- •Автоматизация построения проектов
- •Обзор инструментов построения проектов
- •qmake
- •Генераторы
- •Входные файлы
- •Пути
- •Синтаксис
- •Команды
- •Упражнения
- •Тест рубежного контроля
- •Проектное задание
- •Основные концепции
- •Строки
- •Свойства
- •Примеры простых проектов
- •Команды общего назначения
- •cmake_minimum_required()
- •project()
- •include()
- •message()
- •Команды описания целей
- •add_executable()
- •add_library()
- •add_subdirectory()
- •Команды настроек целей
- •include_directories()
- •target_include_directories()
- •add_definitions(), add_compile_options()
- •target_compile_definitions()
- •target_compile_options()
- •target_compile_features()
- •target_link_libraries()
- •add_dependencies()
- •Команды обработки данных
- •math()
- •list()
- •Команды управляющих конструкций
- •foreach(), endforeach()
- •Команды работы с файлами
- •get_filename_component()
- •Команды добавления специальных целей
- •configure_file()
- •add_test(), enable_testing()
- •install()
- •add_custom_target()
- •Прочие команды
- •find_package()
- •get_property(), set_property()
- •Виды конфигураций
- •Выражения генераторов
- •Информационные выражения
- •Логические выражения
- •Преобразующие выражения
- •Вспомогательные выражения
- •Упражнения
- •Тест рубежного контроля
- •Проектное задание
- •Интерфейс подключения библиотек
- •Подключение заголовочной библиотеки
- •Частичная подмена стандартной библиотеки
- •Интерфейс подключения библиотек
- •Локализация приложения
- •Установка приложения
- •Инструменты разработки
- •Управление версиями
- •Генерирование документации
- •Упражнения
- •Тест рубежного контроля
- •Проектное задание
- •Заключение
- •Библиография
- •Ответы на тесты

2.13. Упражнения
библиотеки, а также определить символ препроцессора
MY_LIB_USE. Какой минимальный набор команд нужно использовать для этого в файле CMakeLists.txt проекта приложения?
(a) target_link_libraries();
(b) target_link_libraries(), include_directories(),
add_definitions();
(c) target_link_libraries(), include_directories(),
add_compile_options().
10. Пусть теперь файл CMakeLists.txt для библиотеки
из предыдущего вопроса был изменён следующим образом:
add_library(my_lib file1.cpp file1.h)
target_include_directories(
my_lib INTERFACE .)
target_compile_definitions(
my_lib PRIVATE -DMY_LIB_USE)
Какой теперь минимальный набор команд нужно использовать в файле CMakeLists.txt проекта приложения для подключения библиотеки этой цели?
(a) target_link_libraries();
(b) target_link_libraries(), add_definitions();
(c) target_link_libraries(), include_directories();
251

2. Основы языка CMake
(d) target_link_libraries(), include_directories(),
add_definitions();
(e) target_link_libraries(), include_directories(),
add_compile_options().
11. Пусть в файле CMakeLists.txt есть следующие команды
для добавления целей библиотек:
add_library(lib1 MODULE lib1.cpp)
add_library(lib2 lib2.cpp)
set(BUILD_SHARED_LIBS FALSE)
add_library(lib3 lib3.cpp)
Пусть инструмент CMake вызывается для этого проекта
при помощи следующей команды:
cmake -G hгенераторi -D BUILD_SHARED_LIBS=1 hпутьi
Каких типов будут созданы цели библиотек lib1, lib2
и lib3 соответственно в результате исполнения инструмента CMake для данного проекта?
(a) STATIC, STATIC, STATIC.
(b) SHARED, STATIC, STATIC.
(c) MODULE, STATIC, STATIC.
(d) MODULE, SHARED, STATIC.
(e) MODULE, SHARED, SHARED.
252

2.13. Упражнения
12. (Вопрос со множественным выбором.) Пусть во входном файле CMake требуется выполнить некоторое действие, если переменная CONDITION содержит значение истины. Как можно
корректно записать команду if() для проверки этого условия?
(a) if(CONDITION EQUAL TRUE)
(b) if(CONDITION STREQUAL TRUE)
(c) if(${CONDITION} STREQUAL TRUE)
(d) if("${CONDITION}" STREQUAL TRUE)
(e) if(CONDITION)
(f) if(${CONDITION})
(g) if("CONDITION")
(h) if("${CONDITION}")
13. Пусть цикл имеет в качестве заголовка следующую команду:
foreach(I RANGE 10)
В этом случае тело цикла будет исполняться:
(a) 1 раз; (b)10 раз; (c) 11 раз.
14. При исполнении следующей команды:
get_property(
SOME VARIABLE PROPERTY CMAKE_MODULE_PATH SET)
значение переменной SOME:
(a) не изменится;
(b) установится в значение «истина»;
253

2. Основы языка CMake
(c) установится в значение «ложь»;
(d) установится в текущее значение специальной перемен-
ной CMAKE_MODULE_PATH.
15. Исполнение системой CMake команды:
add_custom_command(
TARGET prog
PRE_BUILD
COMMAND
"${CMAKE_COMMAND}" -E echo "$<JOIN:a;b;c, - >")
приведёт к тому, что во время перестроения цели prog будет
выведено:
(a) ничего; (b) «$<JOIN:a;b;c, - >»;
(c) «a;b;c, - »; (d)«a;b;c»;
(e) « - a - b - c»; (f) «a - b - c - »;
(g) «a - b - c».
2.13.2. Проектное задание
Выполните задание п. 1.4.2 при помощи системы CMake.
Требования к реализации:
— Части a и b задания должны быть оформлены в виде от-
дельных проектов (располагаться в разных каталогах системы).
254

2.13. Упражнения
— Проект библиотеки должен иметь возможность создавать
как статический, так и динамический/разделяемый вариант.
— Проект библиотеки должен содержать описание целей те-
стирования и установки. Установка должна поддерживать
компоненты для обычного пользователя и для разработчика. Структура каталога установки должна быть аналогичной структуре, приведённой на рис. 2.13.
— Проект библиотеки должен содержать описание интер-
фейсных настроек, применяемых к зависимым проектам.
— Проект приложения должен подключать библиотеку, ис-
пользуя её сценарий, сгенерированный во время установки. Для этого проект приложения должен иметь кэш-настройку, определяющую путь к каталогу установки библиотеки.
Проверьте работоспособность собираемой программы
для различных доступных операционных систем и компиляторов.
255

3. Примеры использования
пакетов
В этой главе будут приведены примеры использования
некоторых популярных программных пакетов в проектах, которые используют систему CMake. Примеры подобраны таким
образом, что демонстрируют решение различных задач, связанных с подключением внешних библиотек и инструментов,
на разном уровне сложности.
3.1. OpenCV
Набор библиотек OpenCV1реализует основные алгоритмы
анализа и обработки изображений («компьютерного зрения»),
в том числе основанных на машинном обучении: рисование,
фильтрация, трансформации, распознавание образов и т. д. Его
название расшифровывается как Open Source Computer Vision Library. Библиотеки имеют открытый исходный код и предоставляются в использование по свободной лицензии BSD. Система
сборки набора библиотек использует инструмент CMake.
1
http://opencv.org/ (дата обращения: 09.02.2015).
256

3.1. OpenCV
Подключение библиотек в проектах, использующих для
построения CMake, достаточно просто: нужно найти соответствующий пакет при помощи команды find_package()
(п. 2.11.1) и установить использование библиотек при компоновке всех нужных целей. Минимальный код, добавляющий
к цели функциональность OpenCV, будет следующим:
# ...
find_package(OpenCV REQUIRED)
# Требуется для OpenCV версии 3
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(my_prog ${OpenCV_LIBS})
После аргумента REQUIRED команды find_package()
можно указать отдельные компоненты, которые требуются для подключения (по умолчанию считается, что нужно
подключить все компоненты). Названия компонент совпадают с названиями соответствующих модулей библиотек
в справочной системе: core, highgui, imgproc и т. д. Полный
список доступных модулей библиотек содержится в переменной OpenCV_LIB_COMPONENTS после выполнения команды
find_package() (набор библиотек может быть собран без каких-то необязательных модулей, например реализующих поддержку технологий CUDA и OpenCL). В результате поиска создаётся переменная OpenCV_LIBS, содержащая список целей биб-
257

3. Примеры использования пакетов
лиотек, которые можно передать в target_link_libraries().
Варианты библиотек выбираются в зависимости от конфигурации построения (для генераторов со множественными
конфигурациями используются аргументы debug и optimized
команды target_link_libraries(), п. 2.6.7) и от значения
специальной переменной BUILD_SHARED_LIBS. Список каталогов поиска подключаемых файлов, который необходимо
передать команде include_directories() и т. п. (выполняется автоматически для OpenCV версий 2.x.x), записывается
в переменную OpenCV_INCLUDE_DIRS. Также после исполнения команды find_package() создаются другие переменные:
OpenCV_VERSION (версия набора библиотек), OpenCV_SHARED
(собраны ли библиотеки в виде разделяемых модулей) и т. д.
ПРИМЕР
Рассмотрим тестовое приложение, которое выводит окно с текстовой надписью (рис. 3.1).
Рис. 3.1. Окно приложения, использующего библиотеки
OpenCV
Файл test_opencv.cpp:
258

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#if CV_MAJOR_VERSION >= 3
#include "opencv2/imgproc/imgproc.hpp"
#endif
const std::string g_cText = "OpenCV test";
const int g_cnFontFace =
cv::FONT_HERSHEY_SCRIPT_SIMPLEX;
const double g_cdFontScale = 3;
const int g_cnThickness = 4;
3.1. OpenCV
int main()
{
cv::Mat image(
200, 600, CV_8UC3, cv::Scalar(200, 250, 250));
int nBaseLine = 0;
cv::Size size = cv::getTextSize(
g_cText, g_cnFontFace, g_cdFontScale,
g_cnThickness, &nBaseLine);
cv::Point textOrigin(
(image.cols - size.width) / 2,
(image.rows + size.height) / 2);
cv::line(
image, textOrigin + cv::Point(0, g_cnThickness),
textOrigin + cv::Point(size.width, g_cnThickness),
cv::Scalar(50, 0, 0));
259

3. Примеры использования пакетов
cv::putText(
image, g_cText, textOrigin, g_cnFontFace,
g_cdFontScale, cv::Scalar(200, 50, 100),
g_cnThickness, CV_AA);
cv::namedWindow(
g_cText.c_str(), CV_WINDOW_AUTOSIZE);
cv::imshow(g_cText.c_str(), image);
cv::waitKey(0);
}
В реализации приложения использованы компоненты
core для хранения изображения (класс cv::Mat) и рисования
примитивов (линии, вывод текста, измерение размеров надписи) и highgui для использования простого оконного интерфейса. В OpenCV 3 функции рисования перенесены в библиотеку
imgproc. Таким образом, описание проекта приложения может
быть следующим (файл CMakeLists.txt):
cmake_minimum_required(VERSION 2.8)
project(test_opencv)
find_package(OpenCV REQUIRED core highgui imgproc)
add_executable(test_opencv WIN32 test_opencv.cpp)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(test_opencv ${OpenCV_LIBS})
260
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
