Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Система построения проектов CMake. Учебник.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
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 Li­brary. Библиотеки имеют открытый исходный код и предостав­ляются в использование по свободной лицензии 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]