Добавил:
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()
- •Виды конфигураций
- •Выражения генераторов
- •Информационные выражения
- •Логические выражения
- •Преобразующие выражения
- •Вспомогательные выражения
- •Упражнения
- •Тест рубежного контроля
- •Проектное задание
- •Интерфейс подключения библиотек
- •Подключение заголовочной библиотеки
- •Частичная подмена стандартной библиотеки
- •Интерфейс подключения библиотек
- •Локализация приложения
- •Установка приложения
- •Инструменты разработки
- •Управление версиями
- •Генерирование документации
- •Упражнения
- •Тест рубежного контроля
- •Проектное задание
- •Заключение
- •Библиография
- •Ответы на тесты

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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
