: # исходники
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, большая часть основных целей соответствует не одному файлу, а набору связанных файлов, таких как отладочная и окончательная сборка исполняемого файла. Чтобы объявить цель для готовой библиотеки, у которой есть несколько вариантов, используйте следующую запись.
Читать дальше