Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Система построения проектов CMake. Учебник.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
3.5. Инструменты разработки
COMMAND
"${DOXYGEN_EXECUTABLE}"
"${CMAKE_CURRENT_BINARY_DIR}/doc/Doxyfile"
WORKING_DIRECTORY
"${CMAKE_CURRENT_SOURCE_DIR}"
DEPENDS
doc/Doxyfile)
Здесь сначала выполняется поиск требуемых инструмен­тов при помощи соответствующих модулей. Исключение со­ставляет инструмент qhelpgenerator, поиск которого не под­держивается конфигурационными файлами Qt и для которо­го не существует модуля поиска в составе CMake. Вместо это­го используется тот факт, что все инструменты Qt при уста­новке помещаются в один каталог. В конфигурационном фай­ле библиотеки Qt5Core определена цель Qt5::moc для ком­пилятора метаобъектов. Путь к инструменту moc содержит­ся в её свойстве IMPORTED_LOCATION (путь к результирующе­му файлу импортируемой цели). Из этого пути выделяется путь к содержащему файл каталогу при помощи команды get_filename_component() (п. 2.9.1), который затем использу­ется для поиска исполняемого файла Qt Help Generator при по­мощи команды find_program() (п. 2.9.2). Библиотека Qt5Core не зависит от других компонент, и на их поиск не тратится лиш­нее время.
После вычисления всех необходимых путей начинается формирование команд цели, которая генерирует файл настро-
391
3. Примеры использования пакетов
ек Doxygen в каталоге построения. Переменной VARS присваи­вается список из имён настроек Doxygen и переменных CMake, содержащих соответствующие значения. Переменной CMDS при­сваивается список аргументов команды add_custom_command()
(п. 2.10.5), определяющих запускаемые инструменты в процес-
се построения. Эта команда описывает правило создания фай­ла doc/Doxyfile в каталоге построения из Doxyfile каталога проекта. Сначала переменной CMDS присваиваются аргументы, определяющие команду копирования входного файла в выход­ной («cmake -E copy ...», см. также пример на с. 223 и заме­чание к нему). Дальше элементы списка VARS обходятся в цик­ле парами (настройка Doxygen + переменная CMake). К перемен­ной CMDS добавляется определение команды, которая дописыва­ет в выходной файл строку вида «hнастройкаi = "hпутьi"». Это делает команда «cmake -E echo ...» с перенаправлением вы­вода в файл.
Последней вызывается команда add_custom_target()
(п. 2.10.4), определяющая фальшивую цель для вызова инстру-
мента Doxygen, которому передаётся сгенерированный файл настроек. В качестве рабочего каталога программы устанавли­вается каталог текущего подпроекта. Это позволяет не менять в настройках Doxygen путей к обрабатываемым файлам и ка­талогам исходных кодов (INPUT и т. д.). В противном случае пришлось бы реализовывать синтаксический разбор файла Doxyfile, что является нетривиальной задачей (в файле на­строек можно подключать другие файлы командами @INCLUDE).
392
3.5. Инструменты разработки
Каталог для генерируемых файлов ранее был записан в файл Doxyfile (настройка OUTPUT_DIRECTORY).
Пример файла CMakeLists.txt, использующего приведён­ный выше модуль doxygen.cmake:
cmake_minimum_required(VERSION 2.8)
project(ex-doxygen)
add_executable(
ex-doxygen
ex-doxygen.cpp ex-classes.cpp ex-classes.h)
include(doxygen.cmake)
Замечание: в качестве альтернативы вызовам команд вида:
cmake -E echo "hстрокаi" >> hфайлi
в цели doc/Doxyfile можно было бы использовать одну ко­манду исполнения сценария («cmake -P ...», п. 2.1.2), который можно сгенерировать командой configure_file() (п. 2.10.1).
N
∗
393
3. Примеры использования пакетов

3.6. Упражнения

3.6.1. Тест рубежного контроля

1. Команда без указания дополнительных компонент:
find_package(OpenCV REQUIRED)
приведёт к тому, что:
(a) Будут найдены файлы скомпилированных модулей
всех библиотек OpenCV, имена соответствующих им целей будут записаны в переменную OpenCV_LIBS.
(b) Поиск файлов библиотек OpenCV выполняться не будет,
конфигурационным файлом будет заполнена лишь пере­менная CMake OpenCV_INCLUDE_DIRS (каталоги подключа­емых файлов библиотек) и остальные переменные конфи­гурационного файла.
(c) Исполнение команды приведёт к аварийному останову
инструмента CMake с выводом сообщения об ошибке.
2. Команда без указания дополнительных компонент:
find_package(Boost REQUIRED)
приведёт к тому, что:
(a) Будут найдены файлы скомпилированных модулей
394
всех библиотек Boost, пути к ним будут записа­ны в переменную CMake Boost_LIBRARIES, а также для каждого компонента по отдельности в переменную
Boost_hкомпонентi_LIBRARY.
3.6. Упражнения
(b) Поиск файлов библиотек Boost выполняться не будет, мо-
дулем поиска будет заполнена лишь переменная CMake Boost_INCLUDE_DIRS (каталоги подключаемых файлов библиотек) и остальные переменные модуля поиска.
(c) Исполнение команды приведёт к аварийному останову
инструмента CMake с выводом сообщения об ошибке.
3. Команда без указания дополнительных компонент:
find_package(Qt5 REQUIRED)
приведёт к тому, что:
(a) Будут найдены файлы скомпилированных моду-
лей всех библиотек Qt, пути к ним будут записа­ны в свойство IMPORTED_LOCATION (а для конфигу­раций с непустыми именами — также в свойства IMPORTED_LOCATION_hконфигурацияi) целей библиотек с именами Qt5::hкомпонентi.
(b) Поиск файлов библиотек Qt выполняться не будет, конфи-
гурационным файлом будет заполнена лишь переменная CMake Qt5_INCLUDE_DIRS (каталоги подключаемых фай­лов библиотек) и остальные переменные конфигурацион­ного файла.
(c) Исполнение команды приведёт к аварийному останову
инструмента CMake с выводом сообщения об ошибке.
395
3. Примеры использования пакетов
4. Команда без указания дополнительных компонент:
find_package(LATEX)
приведёт к тому, что:
(a) Будут найдены исполняемые файлы всех инструментов
LaTeX (latex, bibtex и т. д.), пути к ним будут записаны в переменные CMake hкомпонентi_COMPILER.
(b) Будет найден исполняемый файл только инструмента
latex, путь к нему будет записан в переменную CMake LATEX_COMPILER.
(c) Исполнение команды приведёт к аварийному останову
инструмента CMake с выводом сообщения об ошибке.
5. Если к проекту, использующему набор библиотек Qt 5, тре­буется добавить изображения для использования в исполня­емой цели, имя файла описания ресурсов для изображений в описании проекта на языке CMake нужно передать коман­де:
(a) qt5_wrap_cpp(); (b) qt5_add_resources();
(c) qt5_wrap_ui().
6. Если в проекте, использующем набор библиотек Qt 5, требу-
ется добавить слот к классу диалогового окна (производного от QDialog), обрабатывающий сигналы от дочерних элемен­тов управления (кнопки, поля ввода и т. д.), имя заголовочно­го файла с определением класса диалога в описании проекта на языке CMake нужно передать команде:
(a) qt5_wrap_cpp(); (b) qt5_add_resources();
(c) qt5_wrap_ui().
396
3.6. Упражнения
7. Вызов команды qt5_create_translation() приведёт к до­бавлению в файлы конечной системы построения правил за­пуска:
(a) только инструмента lupdate;
(b) только инструмента lrelease;
(c) как инструмента lupdate, так и lrelease.
8. Вызов команды qt5_add_translation() приведёт к добав-
лению в файлы конечной системы построения правил запус­ка:
(a) только инструмента lupdate;
(b) только инструмента lrelease;
(c) как инструмента lupdate, так и lrelease.

3.6.2. Проектное задание

1. Изучите документацию к наборам библиотек Qt и OpenCV. Реализуйте приложение с графическим пользовательским интерфейсом, предназначенное для просмотра изображе­ний в формате JPEG и других, поддерживаемых Qt, и приме­нения к ним одного из фильтров, реализованных в модуле OpenCV imgproc20(фильтр Собеля, сглаживающий фильтр, преобразования поворота и перспективы, поиск элементов изображения и т. д.). Основные классы Qt, которые могут пригодиться в процессе разработки:
20
http://docs.opencv.org/modules/imgproc/doc/filtering.html
13.05.2015).
(дата обращения:
397
3. Примеры использования пакетов
QMainWindow: реализует основное окно приложения с од-
нооконным пользовательским интерфейсом.
QImage: организует загрузку и хранение в памяти изобра-
жения. Существуют способы преобразования изобра­жения в формат, поддерживаемый OpenCV, и обрат­но21.
QLabel: реализует элемент пользовательского интерфей-
са, способный выводить изображение из объекта класса QPixmap (который может создаваться из объек­та QImage).
QScrollArea: реализует отображение другого элемен-
та управления в области ограниченного размера, добавляя при необходимости полосы прокрутки. Необходим для вывода больших изображений в объ­ектах QLabel. Сам объект можно расположить в главном окне приложения при помощи метода
QMainWindow::setCentralWidget().
QFileDialog: реализует вывод диалогового окна открытия
файла.
QThread: реализует возможность запуска длительных
по времени операций в отдельном потоке.
Требования к разрабатываемому приложению:
— Операции пользовательского интерфейса необходи-
мо реализовать в виде меню или панели управления и т. п. с применением механизма сигналов и слотов.
21
http://answers.opencv.org/question/7779/convert-cvmat-to-qimage/
щения: 13.05.2015).
398
(дата обра-
3.6. Упражнения
— Пользовательский интерфейс необходимо разрабо-
тать в приложении Qt Designer с компиляцией инстру­ментом uic.
— Необходимо поместить пиктограмму основного окна
либо изображения панели инструментов в ресурсы, компилируемые инструментом rcc.
— Необходимо реализовать поддержку локализации
приложения при помощи инструментов Qt Linguist и т. д.
— Необходимо реализовать в проекте цель установки
приложения при помощи стандартного модуля CMake
DeployQt4.
2. Изучите документацию к библиотеке MPIR22, реализую-
щей арифметические операции с длинными целыми, раци­ональными и вещественными числами. Изучите возмож­ные варианты расположения файлов библиотеки в катало­гах сборки и установки при использовании компиляторов gcc и Visual C++, а также сборки в виде статических и дина­мических (разделяемых) версий. Реализуйте модуль CMake для подключения библиотеки, аналогичный приведённо­му в настоящем учебнике для библиотеки Crypto++ (п. 3.4). При помощи этого модуля реализуйте тестовое приложе­ние, выполняющее шифрование и дешифрование длинно­го целого числа при помощи криптографической схемы
22
http://mpir.org/ (дата обращения: 24.09.2015).
399
3. Примеры использования пакетов
RSA23. Протестируйте сборку и работу приложения на плат­формах Windows с различными компиляторами и Linux.
23
http://people.csail.mit.edu/rivest/Rsapaper.pdf (дата обращения: 24.09.2015).
400
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]