C++. Сборник рецептов | страница 44



Проблема

Вы хотите использовать 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 так, чтобы его можно было собрать и как статическую, и как динамическую библиотеку.