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