01 июня, 2009

Компиляция Boost C++ Libraries со статической компоновкой




Введение

Программируя на C++, нам приходиться многое писать с нуля, например, нам нужно создать класс сокетов, класс потоков, класс журналирования, функцию регулярных выражений и т.д. Разработка таких библиотек порой занимает слишком много времени, и заставляет программистов страдать.

Boost предоставляет набор библиотек, которые помогут сократить стоимость разработки. Но использовать эти библиотеки надо с осторожностью. Надо помнить о некоторых вещах при внедрении boost в свой код.

1. Некоторые библиотеки требуют динамической компоновки по умолчанию
2. Различные версии динамических библиотек не совместимы
3. Различные версии glibc могут иметь разные наборы библиотек для одной версии Boost

Что касается первого, такие библиотеки как Boost.Thread и Boost.Regex используют динамическую компоновку по умолчанию. К счастью Boost умеет статическую компоновку для этих библиотек.

Второе, приложение, которое требуют динамически скомпилированную библиотеку Boost версии A, не может быть запущено с динамически откомпилированой Boost версии B, поэтому я предпочитаю статическую компиляцию библиотек.

И третье, в окружении Linux код, который компилируется GCC-4.1, может не запуститься с GCC-3.4, потому что они испольуют разное окружение glibc. Но при компиляции Boost можно указать версию gcc, так что библиотеки могут быть основаны на требуемой версии glibc.

Компиляция Boost Library со статической компоновкой и требуемой версии GCC

1. скачайте Boost

2. ./configure
(по умолчанию билиотеки и заголовочные файлы будут установлены в /usr/local, запуская ./configure, Вы можете указать целевое расположение: –prefix,) например, ./configure –prefix=/usr

3. Правьте конфигурационные файлы если Вы хотите исользовать свою версию GCC при компиляции Boost.
Например изменить
using gcc ;
на
using gcc : 3.4 : g++34 ;

4. Если мы хотим статическую компоновку библиотек для boost, потребуется полная компиляция. Изменим Makefile после запуска ./configure
BJAM_CONFIG=–build-type=complete

5. make; sudo make install

Библиотеки Boost установятся в /usr/local/lib/libboost_*
Заголовочные файлы, etc.. (Boost includes) установятся в /usr/local/include/boost-1_35

Откомпилируем код используя статическую библиотеку Boost.Thread

g++34 -o myApp{,.cc} -I/usr/local/include/boost-1_35/ -L/usr/local/lib -lboost_thread-gcc34-mt-s -lpthread


(Помните, что при использовании статической компоновки, Вам потребуется указать флаг -lpthread, если же Вы используете динамическую компоновку, Вы можете пропустить флаг -lpthread.)


Enjoy hacking with boost!