1.8. Сборка статической библиотеки с помощью Boost.Build
Проблема
Вы хотите использовать Boost.Build для сборки статической библиотеки из набора исходных файлов С++, таких как перечисленные в примере 1.1.
Решение
В директории, где вы хотите создать статическую библиотеку, создайте файл Jamroot . В файле Jamroot вызовите правило lib, объявляющее целевую библиотеку, указав в качестве исходных файлов свои файлы .cpp и используя в качестве требования свойство
static. Чтобы указать директорию поиска заголовочных файлов библиотеки, т. е. директорию, относительно которой должны разрешаться директивы
includeдля заголовочных файлов этой библиотеки, добавьте требование к использованию в виде
путь . Чтобы указать компилятору, где искать включенные заголовки, может потребоваться использовать несколько директив вида
путь . Наконец, в директории, содержащей
Jamroot , запустите
bjam , как описано в рецепте 1.7.
Например, чтобы собрать статическую библиотеку из исходных файлов, перечисленных в примере 1.1, ваш Jamroot может выглядеть как в примере 1.11.
Пример 1.11. Jam файл для сборки статической библиотеки libjohnpaul.lib или libjohnpaul.a
# Jamfile для проекта libjohnpaul
lib libjohnpaul
: # исходники
john.cpp paul.cpp johnpaul.cpp
: # требования
static
: # сборка-по-умолчанию
: # требования-к-использованию
..
;
Чтобы собрать библиотеку, введите:
> bjam libjohnpaul
Обсуждение
Правило libиспользуется для объявления цели, представляющей статическую или динамическую библиотеку. Как показано в примере 1.9, оно имеет такой же вид, что и правило exe. Использование требования ..освобождает проект, который зависит от вашей библиотеки, от необходимости явно указывать в своих требованиях директорию заголовочных файлов вашей библиотеки. Требование
staticуказывает, что ваша цель должна всегда собираться как статическая библиотека. Если вы хотите сохранить возможность сборки целевой библиотеки как статической и как динамической, опустите требование
static. Должна ли библиотека собираться как статическая или как динамическая, может быть указано в командной строке или в требованиях цели, которая зависит от целевой библиотеки. Например, если в примере 1.11 требование
staticопустить, то чтобы собрать цель
libjohnpaulкак статическую библиотеку, потребуется ввести команду:
> bjam libjohnpaul link=static
Однако написание исходного кода для библиотеки, которая может быть собрана и как статическая, и как динамическая, является нетривиальной задачей, что показано в рецепте 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
Читать дальше