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

Переменные, влияющие на вариант выбираемых
библиотек Boost
Переменная Описание Умолчание
Логические
Boost_USE_MULTITHREADED Многопоточные Да
Boost_USE_STATIC_LIBS Статические Да
3.2. Boost
Таблица 3.3
Boost_USE_STATIC_RUNTIME Со статически-
ми стандартными библиотеками
Boost_USE_DEBUG_RUNTIME С отладочными
стандартными
библиотеками
Строковые
Boost_COMPILER Суффикс компи-
лятора (-vc120,
-gcc49 и т. д.)
В зависимости от платформы
Да
В зависимости от компилятора
Замечание: возможны разные схемы именования библиотек
Boost. Как правило, установленные в системах на основе ядра
Linux версии из репозитариев не имеют в именах суффиксов,
обозначающих вариант библиотеки. В этом случае библиотеки
доступны в единственном варианте и настройки из табл. 3.3
не оказывают никакого влияния.
N
271

3. Примеры использования пакетов
После выполнения модуль FindBoost.cmake устанавливает в следующих основных переменных (табл. 3.4) результаты
своей работы.
Таблица 3.4
Переменные с результатами поиска библиотек Boost
Переменная Описание
Boost_FOUND Истина, если заданные библио-
теки найдены
Boost_INCLUDE_DIRS Каталоги заголовочных фай-
лов
Boost_LIBRARIES Библиотеки для подключения
к цели
Boost_hкомпонентi_FOUND Истина, если найден заданный
hкомпонентi
*
Boost_hкомпонентi_LIBRARY Библиотеки для подключения
заданного компонента
*
Boost_VERSION Версия найденных библиотек
Boost_LIB_VERSION Суффикс версии в файлах биб-
лиотек
*
hкомпонентi пишется в верхнем регистре.
3.2.2. Подключение заголовочной библиотеки
Подключение библиотеки Boost, состоящей только из заголовочных файлов, выполняется проще всего, так как в этом случае нет необходимости заботиться о выборе нужного варианта
272

3.2. Boost
файлов библиотеки. Заголовочные файлы могут только различаться версией Boost, располагаясь в разных подкаталогах. Общая схема подключения выглядит следующим образом:
# ...
find_package(Boost hверсияi REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(hцель1i hфайл
i ... hфайл
1,1
n,1
i)
# ...
Замечание: для выполнения поиска библиотек Boost команде
find_package() (п. 2.11.1) передаются только имена тех компонент, которые имеют файлы библиотек, необходимые для подключения к целям, а не те, которые состоят только из заголовочных файлов. Поскольку в рассматриваемом случае таких библиотек нет, список компонент после аргумента REQUIRED тоже
пуст.
N
ПРИМЕР
Пусть требуется скомпилировать следующую программу (файл
ex-mpl.cpp), которая использует заголовочные файлы библиотек MPL и TypeTraits:
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/for_each.hpp>
273

3. Примеры использования пакетов
#include <boost/mpl/filter_view.hpp>
#include <boost/mpl/transform_view.hpp>
#include <boost/type_traits.hpp>
#include <iostream>
#include <typeinfo>
namespace mpl = boost::mpl;
using namespace mpl::placeholders;
template <typename Types>
struct get_pointees :
mpl::transform_view
<
mpl::filter_view
<
Types,
boost::is_pointer <_>
>,
boost::remove_pointer <_>
>
{ };
template <typename T>
struct wrap
{ };
274

struct print_type
{
template <class T>
void operator () (wrap <T>) const
{
std::cout << typeid (T).name() << " | ";
}
};
template <class TSeq>
3.2. Boost
void print_types()
{
mpl::for_each <TSeq, wrap <_> > (print_type());
std::cout << std::endl;
}
int main()
{
typedef
mpl::vector
<
char, short *,
volatile int **,
long,
long long [10]
>
275

3. Примеры использования пакетов
types_ptrs;
//
print_types <types_ptrs> ();
print_types <get_pointees <types_ptrs>::type> ();
}
В этой программе на печать выводится сначала список названий типов, содержащихся в контейнере types_ptrs (предполагается, что в нём нет ссылочных типов), а затем названия типов, для которых в исходном списке присутствуют типы-указатели.
Для генерирования проекта можно использовать файл
CMakeLists.txt со следующим содержимым:
cmake_minimum_required(VERSION 2.8)
project(ex-mpl)
find_package(Boost 1.32.0 REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(ex-mpl ex-mpl.cpp)
Здесь указана версия Boost 1.32, так как это последняя версия, в которой были внесены изменения в библиотеку MPL,
а также после неё не происходило изменений в заголовочных
файлах библиотеки TypeTraits, которые были бы существенны
для этой программы. Установка минимально возможной вер-
276

3.2. Boost
сии Boost позволяет собрать проект на системах с давно не обновлявшимся ПО. ∗
Замечание: если требуется поддержка статических вариантов
сборки проекта при помощи компилятора Microsoft Visual C++,
можно использовать модуль correct_vc_static.cmake из примера на с. 258.
Команда вызова инструмента CMake для проекта, использующего только заголовочные библиотеки Boost, может быть
следующей:
cmake^
-D CMAKE_PREFIX_PATH=hпуть_к_Boosti^
-D Boost_ADDITIONAL_VERSIONS=1.59.0;1.59^
hдругие_настройкиi^
hкаталог_проектаi
Как обычно, в переменной CMAKE_PREFIX_PATH могут быть
перечислены и иные пути для поиска других пакетов (через
N
точку с запятой). Путь может указывать на тот каталог, в который был установлен Boost во время сборки при помощи ключа
«--prefix=...» его системы построения. Однако установка вы-
полняется только после сборки всех библиотек Boost, а это может занять много времени. Если требуется использовать только
«заголовочные» библиотеки, можно разархивировать исходные
коды Boost в отдельный каталог и передать CMake путь к нему.
Модуль поиска FindBoost.cmake корректно определит в этом
случае значение переменной Boost_INCLUDE_DIRS.
277

3. Примеры использования пакетов
3.2.3. Подключение библиотеки с модулем компоновки
Подключение скомпилированных файлов библиотек Boost
кроме приведённых ранее команд дополнительно требует использования команды target_link_libraries():
# ...
find_package(
Boost hверсияi REQUIRED hкомпонент1i ... hкомпонентmi)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(hцель1i hфайл
i ... hфайл
1,1
n,1
i)
target_link_libraries(hцель1i ${Boost_LIBRARIES})
# ...
В переменную Boost_LIBRARIES модуль поиска Boost запишет пути к файлам библиотечных модулей, при необходимости
вместе с аргументами debug и optimized (см. п. 2.6.7).
При подключении библиотеки, имеющей в своём составе скомпилированный модуль, следует учитывать, что необходимо правильно выбрать нужный вариант его сборки в зависимости от конфигурации построения проекта и других условий. За выбор отвечают переменные модуля FindBoost.cmake
из табл. 3.3.
278

3.2. Boost
ПРИМЕР
Пусть требуется собрать следующую программу, которая использует библиотеку Program Options (файл ex-boost.cpp):
#include <boost/program_options.hpp>
#include <iostream>
using namespace boost::program_options;
void usage(const options_description &rcDesc)
{
std::cout <<
"\nUsage:\n ex-boost [<options>]\n\n" <<
rcDesc << std::endl;
}
int main(int nArgC, char *apszArgV[])
{
options_description desc("Allowed options");
variables_map vars;
try
{
desc.add_options()
("help,h", "print help message")
("version,v", "print version string")
("number,n", value <int> (), "set some number")
;
279

3. Примеры использования пакетов
store(
parse_command_line(
nArgC, apszArgV, desc), vars);
notify(vars);
}
catch (const error &rcError)
{
std::cout <<
std::endl << "Command line error: " <<
rcError.what() << std::endl;
usage(desc);
return 1;
} // catch (const error &)
//
if (vars.count("help"))
usage(desc);
//
for (auto pair : vars)
{
std::cout << pair.first;
if (int *pn = boost::any_cast <int> (
&pair.second.value()))
std::cout << ": " << *pn;
std::cout << std::endl;
} // for (auto pair : vars)
} // main()
280
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
