Д. Стефенс - C++. Сборник рецептов
- Название:C++. Сборник рецептов
- Автор:
- Жанр:
- Издательство:КУДИЦ-ПРЕСС
- Год:2007
- Город:Москва
- ISBN:5-91136-030-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Д. Стефенс - C++. Сборник рецептов краткое содержание
Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.
C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Однако написание исходного кода для библиотеки, которая может быть собрана и как статическая, и как динамическая, является нетривиальной задачей, что показано в рецепте 1.9.
Рецепты 1.3, 1.11 и 1.16.
1.9. Сборка динамической библиотеки с помощью Boost.Build
Вы хотите использовать Boost.Build для сборки динамической библиотеки из набора исходных файлов С++, таких как перечисленные в примере 1.2.
В директории, где вы хотите создать динамическую библиотеку и, если надо, библиотеку импорта, создайте файл Jamroot . В файле Jamroot вызовите правило lib
, объявляющее целевую библиотеку, указав в качестве исходных файлов свои файлы .cpp и используя в качестве требования свойство
shared
. Чтобы указать директорию поиска заголовочных файлов библиотеки, т.е. директорию, относительно которой должны разрешаться директивы include
для заголовочных файлов этой библиотеки, добавьте требование к использованию в виде путь
. Если исходные файлы включают заголовки от других библиотек, то чтобы сказать компилятору, где искать заголовочные файлы, вам может потребоваться добавить несколько требований в виде путь
. Чтобы гарантировать, что символы вашей динамической библиотеки будут экспортированы в Windows с помощью директивы __declspec(dllexport)
, вам также может потребоваться добавить одно или несколько требований в виде символ
. Наконец, в директории, содержащей Jamroot , запустите bjam , как описано в рецепте 1.7.
Например, чтобы собрать из исходных файлов, перечисленных в примере 1.2, динамическую библиотеку, создайте в директории georgeringo файл с именем Jamroot , показанный в примере 1.12.
Пример 1.12. Jam-файл для сборки динамической библиотеки georgeringo.so, georgeringo.dll или georgeringo.dylib
# Jamfile для проекта georgeringo
lib libgeorgeringo
: # исходники
george.cpp ringo.cpp georgeringo.cpp
: # требования
shared
GEORGERINGO_DLL
: # сборка-по-умолчанию
: # требования-к-использованию
..
;
Чтобы собрать библиотеку, введите:
> bjam libgeorgeringo
Как обсуждалось в рецепте 1.8, правило lib
используется для объявления цели, представляющей статическую или динамическую библиотеку. Использование требования ..
освобождает проект, который зависит от вашей библиотеки, от необходимости явно указывать в своих требованиях директорию заголовочных файлов вашей библиотеки. Требование
shared
указывает, что цель должна всегда собираться как динамическая библиотека. Если вы хотите иметь возможность собирать библиотеку и как статическую, и как динамическую, опустите требование shared
и укажите это свойство в командной строке или в требованиях цели, которая зависит от вашей целевой библиотеки. Однако написание библиотеки, которая может быть собрана и как статическая, и как динамическая, требует особого внимания, так как для правильного экспорта символов в Windows требуется использовать директивы препроцессора. Хорошим упражнением является переписывание примера 1.2 так, чтобы его можно было собрать и как статическую, и как динамическую библиотеку.
Рецепты 1.4, 1.12, 1.17 и 1.19.
1.10. Сборка сложного приложения с помощью BoostBuild
Вы хотите использовать Boost.Build для сборки исполняемого файла, зависящего от нескольких статических и динамических библиотек.
Выполните следующие шаги.
1. Для каждой библиотеки, от которой зависит исполняемый файл, — при условии, что она не распространяется в виде готового бинарного файла, — создайте Jam-файл, как описано в рецептах 1.8 и 1.9.
2. В директории, где вы хотите создать исполняемый файл, создайте файл Jamroot .
3. В файле Jamroot вызовите правило exe, объявляющее целевой исполняемый файл. Укажите свои файлы .cpp и цели библиотек, от которых исполняемый файл зависит как от источников. Также, если требуется, добавьте свойства вида путь
, чтобы сказать компилятору, где искать заголовочные файлы библиотек.
4. В файле Jamroot вызовите правило install
, определяющее в качестве требований свойства on
, EXE
и SHARED_LIB
.
5. В директории, содержащей Jamroot , запустите bjam , как описано в рецепте 1.7.
6. Например, чтобы собрать из исходных файлов, перечисленных в примере 1.3, исполняемый файл, создайте в директории hellobeatles файл с именем Jamroot , показанный в примере 1.13.
Пример 1.13. Jam-файл для сборки исполняемого файла hellobeatles.exe или hellobeatles
# Jamfile для проекта hellobeatles
exe hellobeatles
: # исходники
../johnpaul//libjohnpaul
../georgeringo//libgeorgeringo
hellobeatles.cpp
;
install dist
: # исходники
hellobeatles
: # требования
on
EXE
SHARED_LIB
.
;
Теперь введите:
> bjam hellobeatles
находясь в директории hellobeatles . В результате этого вначале будут собраны два проекта, от которых зависит цель hellobeatles , а затем будет собрана цель hellobeatles
. Наконец, введите:
> bjam dist
В результате исполняемый файл hellobeatles и динамическая библиотека georgeringo будут скопированы в директорию, содержащую файл hellobeatles.cpp .
Как было сказано в рецепте 1.5, прежде чем запускать hellobeatles , вы должны поместить копию рабочей библиотеки вашего инструментария в такое место, где операционная система сможет ее найти.
Цели библиотек, от которых зависит данная цель, указываются как источники с помощью записи path // target-name
. В рецептах 1.8 и 1.9 я показал, как объявлять цель для сборки библиотеки из исходного кода с помощью Boost.Build Однако если библиотека доступна в виде готового двоичного файла, вы можете объявить цель для нее следующим образом.
lib имя-цели
:
: имя-файла
;
Как объяснялось в рецепте 1.7, большая часть основных целей соответствует не одному файлу, а набору связанных файлов, таких как отладочная и окончательная сборка исполняемого файла. Чтобы объявить цель для готовой библиотеки, у которой есть несколько вариантов, используйте следующую запись.
lib имя цели
:
: имя-файла требования
;
lib имя-цели
: другое-имя-файла другие-требования
;
Например, отладочный и окончательный варианты готовой библиотеки могут быть объявлены следующим образом.
lib cryptolib
:
Интервал:
Закладка: