среда, 23 ноября 2011 г.

Boost и CMake для Windows (подробности)

Новичкам Boost и CMake посвящается ...

Для тех, кто только начинает осваивать кроссплатформенные средства о которых шел разговор в сообщении "Boost и CMake для Windows" этого блога, я решил добавить немного подробностей в обсуждаемую там тему.

Прежде всего, необходимо заметить, что операционная система Windows относится к сугубо проприентарным системам, и, видимо, как следствие этого, наиболее функциональной средой разработки кода под эту систему является Microsoft Visual Studio. Нравится это кому-нибудь или нет, можно обсуждать отдельно, но данный факт, видимо, не подлежит сомнению. Соответственно, нельзя обвинять софтверные компании в том, что предоставляя компилируемый продукт под Windows они предоставляют, прежде всего, средства компиляции, ориентированные именно на MSVS.

Boost

Набор библиотек Boost, сегодня, является полезным артефактом, который пока не нашел полное свое отражение в стандарте C++, хотя часть из списка библиотек набора Boost уже вошло в стандарт в виде TR1 (Technical Report). Так, если быть конкретным, то сегодня туда входят 10 библиотек, а формируемый стандарт C++0x даже несколько расширил этот десяток в своем TR1. Остальные библиотеки набора Boost (может быть не все, но большая часть) должны войти в стандарт C++0x в виде TR2.

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

Вообще, новичкам небезынтересно будет знать, что многие библиотеки Boost не имеют бинарных файлов, содержащих наборы функций, специфичных для данной среды исполнения, а потому не требуют компиляции.  Т.е. некоторые части Boost можно использовать в виде "как есть", без компиляции. Такие элементы Boost содержат в себе только *.hpp файлы. Для того чтобы их использовать нужно просто выполнить #include <boost/some_boost_lib/some_file.hpp> и указать компилятору путь размещения заголовочных файлов boost, эти файлы уже не были размещены по путям, известным компилятору. Однако, если требуемые вам части Boost основаны не только на *.hpp, но и поддержаны бинарниками, то их придется компилировать для вашей среды исполнения.

Так вот, если вернуться к теме установки Boost под Windows, то следует заметить следующий факт. Сложности, с которыми я столкнулся видимо имеют две основные причины. Во-первых, мои корявые руки, а, во-вторых, то, что я не использовал установку MSVS под которую, собственно, и была заточена инсталляция. Другими словами, я пытался откушать супа деревянной вилкой, что не есть правильно.

Работая и проживая долгие годы в Linux, я привык смотреть на вещи несколько иначе, нежели того требует работа с Windows. Отсюда, мои "корявые руки". Да и первоначальные проблемы были связан с недопониманием того, что надо было что-то делать с файлами Boost после того, как я их извлек из архива. В Linux я просто сообщаю установщику пакетов о том, что мне нужен boost и после того, как он мне скажет примерно следующее - "все исполнено, мой господин", я начинаю использовать библиотеки Boost. Т.е. в Linux я не перехожу из образа программиста в образ администратора с шаманским бубном для выполнения необходимых танцев и заклинаний.

Итак, я уже говорил, что после безуспешных попыток "откушать супа деревянной вилкой" я обнаружил наличие порта установки Boost через систему CMake. Это было решение проблемы в той ситуации, которую я сам себе создал.

CMake

Итак, я скачал себе Boost для CMake, извлек из скаченного архива исходный материал для компиляции, зашёл в корневую директорию полученной сборки и увидел там заветный файл CMakeLists.txt. Этот файл представляет собой сценарий компиляции для кроссплатформенной системы сборки CMake.

При обработке конфигурационного файла, система CMake использует, так называемые генераторы сборки, чтобы адаптировать сборку под требуемую систему компиляции. Приведу список известных генераторов сборки, которые я взял из документации к CMake 2.6, которая только что подвернулась мне по запросу в Google.

Вот такой вот список поддерживаемых на тот момент систем сборки. И все это на основе одного исходного материала, в котором указывается, фактически, цель сборки и список файлов, которые должны участвовать в сборке.

Так как я собирался делать сборку средствами установленной ранее MinGW, то я, вызывая утилиту cmake, сообщил ей явно о необходимости использования генератора "MinGW Makefiles". В противном случае, cmake начал бы работать согласно своим стандартным настройкам для той операционной системы, которую он обнаружил бы в начале своей работы.

Итак, чтобы подготовить сборку Boost для компиляции средствами MinGW, я выполнил в командной строке, в корневом каталоге Boost, где размещен центральный файл CMakeLists.txt, следующую команду.

> cmake -G "MinGW Makefiles"

В результате я получил Makefile, который должен был исполнить утилитой make, входящей в состав установленного MinGW. В моей системе это получилось выполнением следующей команды относительно директории с лежащим в ней сценарием сборки Makefile.

> mingw32-make

После того, как компиляция была закончена, в текущей директории появилась поддиректория lib с бинарными файлами библиотек Boost.

MinGW

Установить MinGW не сложно. Нужно просто скачать в сети инсталлятор нужной версии и запустить его.
 
Я использовал MinGW входящий в состав комплексного инсталлятора для среды разработки QtCreator под Windows, куда входила сама среда разработки QtCreator, средства Qt SDK и система компиляции MinGW.

Единственное, что может потребоваться, это установка путей на директорию bin установленной системы MinGW.

Так, например, так как я использовал MinGW, который был инкапсулирован в среду разработки и компиляции программ написанных на Qt в среде разработки QtCreator, то информация об установленном MinGW не была объявлена операционной системе в виде путей. Это как раз тот случай, когда это понадобится сделать самому, иначе CMake не будет отрабатывать заданный генератор, и вызвать mingw32-make без указания полного пути не удастся.

В своей системе, мне понадобилось добавить в системные пути путь "C:\Qt\qtcreator-2.3.1\mingw\bin".

Использование Boost.

У новичков могут возникнуть вопросы по использованию скомпилированного Boost.

В зависимости от используемой вами среды разработки и системы сборки проекта это может выглядеть по разному, но суть всегда одинакова. Надо сделать три вещи.
1. Указать путь до включаемых файлов Boost там, где указываются пути до include-файлов.
2. Указать путь до скомпилированных файлов, помещенных в каталог lib, там, где указываются пути до файлов библиотек.
3. Указать имя библиотеки из Boost, которую вы собираетесь использовать, там, где указываются библиотеки для линковки с объектными файлами вашей программы.

3 комментария:

Игорь комментирует...

Здравствуйте, Алексей. У Вас несколько устаревшая информация. Новый стандарт с++ уже три месяца как официально принят.
Сам стандарт конечно платный (http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372), но вы можете бесплатно скачать последний драфт. По сути это и есть стандарт. Скачать можно где то здесь http://www.open-std.org/jtc1/sc22/wg21/. Ну или скажите, я Вам его пришлю.
Cmake Вы тоже используете очень старый. Сейчас уже версия 2.8.6. Смотрите подробнее на cmake.org

knzsoft комментирует...

Если честно, то всегда было лень за этим следить. Даже когда писал эту статью в блог, поленился посмотреть что сейчас вошло в очередной TRx. Про принятие стандарта знаю благодаря усердным студентам-коллегам, присылающим мне ссылки о важных новостях в аську или скайп, но, как правило, не углубляюсь. Так и в этот раз, решил обойтись общими нейтральными фразами. Однако, все-равно, спасибо :) Знаю, что ты, Игорь, как правило, говоришь по существу на проверенном материале. За это тебе мой очередной риспект :)

knzsoft комментирует...

CMake у меня новый - обновляется в репозитории в ногу со временем :) Это я сослался на документацию из 2.6, потому как взял то, что первое подвернулось в поиске на Google по запросу о генераторах сборки. Думаю, что здесь это совсем не важно, а я, ты знаешь, очень ленив :)