Создание игр » Featured, Уроки » Boost
Boost
Boost является одной из самых известных и наиболее часто используемых программистами С++ библиотек. Сейчас сложно даже представить область программирования (веду речь про С++), где бы не использовался boost или хотя бы отдельные его части. На самом деле буст это общее название, своеобразное знамя, собирающее под собой целую кучу различных библиотек, которые охватывают огромное количество повседневных задач. Именно из-за того, что boost значительно упрощает и ускоряет разработку ПО, он и завоевал такую большую популярность. Естественно, boost используется и при разработке игр, по тем же самым причинам: экономия времени, надёжность, проверенность временем, широкая известность (легко найти нужных программистов), простота использования.
Не подумайте, что я пишу все эти статьи по установке “лишнего” софта только от того, что мне нечего больше написать – просто этот софт нам понадобится уже в самых ближайших уроках и без него вы не сможете продолжить создание наших с вами общих игр.
Где взять Boost
Boost это свободное программное обеспечение и скачать его исходники можно с
Компоненты Boost
Как я уже сказал, в состав boost входит довольно большое количество библиотек. Кстати, большой плюс буста в том, что он является кроссплатформенным, т.е. он работает и под Windows, и под Linux, и под MacOS – то есть под большинством наиболее распространённых операционных систем. И для того, что бы портировать вашу программу из-под Windows, например, под MacOS, вам не нужно будет даже прикасаться к коду, использующему boost – достаточно просто перекомпилировать программу и всё будет работать.
Наиболее часто используются следующие компоненты Boost:
- boost::asio – библиотека работы с сетью. Через некоторое время я покажу в уроках как его использовать.
- boost::bind – очень часто используемая библиотека, в ней находятся враперы для простого использования фукнторов, указателей на функции и т.д.
- boost::CRC – библиотека функций CRC (контрольные суммы)
- boost::DateTime – функции работы с датой/временем/периодами времени
- boost::Filesystem – функции работы с фалами и файловой системой
- boost::Function – врапперы для отложенного вызова функций и реализации коллбэков
- boost::Interprocess – функции для межпроцессоного взаимодействия. С их помощью разные процессы (программы) могут общаться друг с другом.
- boost::Pool – функционал для работы с пуллами
- boost::ProgramOptions – функции для простой работы с опицями программы
- boost::Python – обёртки для простой интеграции питона в ваши приложения или расшаривания ваших функций и библиотек в питон
- boost::Regex – библиотека для работы с регулярными выражениям
- boost::Serialization – сериализация и десериализация объектов. Можно использовать, например, для созхранения состояния игры в файл и для чтения из файла.
- boost::Signals/Signals2 – реализации концепции сигналов/слотов. Например, с помощью этой библиотеки можно организовать обмен сообщениями (между монстрами в игре, скажем)
- boost::SmartPtr – крайне часто используемая библиотека, реализующая концепцию умных указателей. Работать без неё просто невозможно )))
- ну и ещё много-много разных других компонент
Компиляция Boost
Часть библиотек из состава boost не требуют установки и вы можете использовать их просто через инклюды. Но значительную часть, всё же, придётся для начала скомпилировать в библиотеки. Самый простой метод, это использовать boost-jam. Скачайте его
Есть и более правильный способ: просто запустите в папке boost’а файлик bootstrap.bat – он соберёт для вас bjam последней версии, это надёжнее и более правильно.
Что бы посмотреть все доступные опции сборки надо ввести команду:
bjam --help |
До начала сборки самого буста позаботьтесь о том, что бы на диске было свободно хотя бы 3-4 гигабайта свободного места. Ага, буст это штука немаленькая. Однако, не волнуйтесь – когда вы будете собирать свои программы с использованием буст, они не будут разрастаться до гигабайтных размеров – просто буст собирает все библиотеки в куче разных вариантов (линковки), да и потом, при сборке ваших программ, в них будут добавляться лишь реально используемые вами функции буста, а вовсе не вся библиотека. Если какие-то из вариантов линковки вы не собираетесь использовать никогда – вы можете отключить их компиляцию и тогда сборка буста пройдёт существенно быстрее. Однако, никогда наперёд не знаешь, понадобиться оно или нет, потому лучше скомпилировать всё – пусть будет, лишним не будет.
Итак, давайте запустим сборку:
bjam --build-type=complete msvc stage --without-python |
Я отключил сорку буст-питон, т.к. он нам не нужен. Если вам он нужен и питон (включая исходники и либы) стоит у вас на компе – не отключайте его.
Теперь можно налить себе кофе, включить любимый сериал и долго-долго смотреть его… Процесс компиляции буста очень (ну оооочень) не быстрый. Я вас очень прошу – сделайте сборку буста сами, не пытайтесь найти где скачать её в сети – даже если вы сможете найти, есть очень большая вероятность, что она у вас просто не зработает…
Во время компиляции может сыпаться довольного много варнингов – просто не обращайте на них внимания – сборка всё равно должна пройти успешно.
В зависимости от мощности вашего компьютера, где-то через 20-60 минут сборка буста закончится. В папке boost’а появится новая папка “stage/libs” – в ней лежат все собранные библиотеки буста.
Подключение Boost к Visual C++
Осталось только добавить эту папку в список папок билиотек Visual Studio. И в список папок-инклюдов добавить “ваша_папка_где_буст/boost” – там лежат инклюды буста, а в либы добавлем папку “где_лежит_буст/stage/lib”. На этом установка буста закончена и он готов к использованию. Что бы убедиться в этом, вы можете взять любой пример с сайта boost’а и попробовать его скомпилировать.
Этот урок закончен. В следующем уроке я расскажу вам о том, как поставить и настроить luabind, который сильно упростит нам жизнь, а точнее позволит более просто использовать lua-скрипты в наших программах.
Если у вас возникнут какие-либо трудности при установке буста, напишите в комментах – я постараюсь помочь каждому обратившемуся.
Здравствуйте,
у вас очень хорошие уроки.
Не знал, куда написать этот вопрос. Скорее подходит под тему boost. Я понимаю, что решения в проектировании сильно зависят от задачи, но всё же интересно, как вы поступаете в следующем случае.
Есть некоторое хранилище персонажей. Дерево или просто список. И вдруг нам захотелось сделать отношения между ними. Отношение один к одному. Как лучше поступить? Хорошие книги по C++ так хвалят интеллектуальные указатели, что обычными аж страшно пользоваться порой.
/////
std::vector characters;
typedef boost::weak_ptr CharacterPtr;
struct rel
{
std::pair link;
int value; // собственно структура для того, чтобы мы могли в любом случае подключить сюда не просто числовое значение
}
/////
Это правильно? То есть статическое выделение памяти лучше не использовать? Или можно было просто создать std::vector и указатели Character*?
И глупый вопрос: shared_ptr, указывающий на статически выделенную память – это беда?
Просто при проектировании во многих местах выходит так, и меня это немного беспокоит.
Ой, забыл, что теги режутся. Не знаю, как лучше, напишу так тогда (квадратные скобки вместо угловых):
std::vector]boost::shared_ptr]Character[ [ characters;
typedef boost::weak_ptr]Character[ CharacterPtr;
struct rel
{
std::pair]CharacterPtr, CharacterPtr[ link;
"Или можно было просто создать std::vector]Character[ и указатели Character*?
Just guest, спасибо за комментарий
Просто vector Вам однозначно не подойдёт – при добавлении новых чаров, вектор может перенести свои данные в новый участок памяти (релокация данных при нехватке текущей зарезервированной вектором памяти) и тогда все ваши указатели станут недействительными, что, в самом лучшем случае, приведёт просто к ошибкам, а, скорее всего, к падению программы.
Потому, если Вы планируете где-то использовать указатели на ваших чаров (не важно – умные или нет), то векторе следует хранить указатели (либо обычные, либо умные).
При этом, если у Вас может возникнуть ситуация, когда какой-то из чаров был удалён, но на него могут ссылаться другие чары – Вам однозначно стоит хранить в векторе shared_ptr’ы, а для ссылок на этих чаров из других персов, использовать, например, слабые указатели (weak_ptr).
По крайней мере на первый взгляд такой подход мне видится наиболее разумным.
>при добавлении новых чаров, вектор может перенести свои данные в новый участок памяти
Черт, точно, все как всегда на поверхности. Спасибо огромное.
А weak_ptr не потеряет shared, к которому он привязан, при релокации? Я просто не знаю деталей его устройства.
Just guest, рад был помочь )
Не забывайте так же, что если Вам заранее известен максимальный предел (количество) чаров в массиве, Вы можете просто зарезервировать место через vector.reserve() и тогда реалокаций гарантированно не будет. Что бы узнать какой максимум резерва можно сделать используйте vector.max_size(). Правда, если при этом использовать обычные указатели – не будет возможности переставлять элементы вектора (отсортировать, скажем).
Шаредпоинтер данные не потеряет, не беспокойтесь, так же, как и слабый указатель вроде бы не должен. Хотя на счёт слабого – у меня нет 100% уверенности. Надо посмотреть литературу, либо, проще всего, потестить в коде просто )
Спасибо за статью.
Вопрос – при компиляции буста образуется несколько вариантов библиотек, например для boost_iostreams
libboost_iostreams-vc80-mt-1_47.lib
libboost_iostreams-vc80-mt-gd-1_47.lib
libboost_iostreams-vc80-mt-s-1_47.lib
libboost_iostreams-vc80-mt-sgd-1_47.lib
libboost_iostreams-vc80-s-1_47.lib
libboost_iostreams-vc80-sgd-1_47.lib
Какую из них использовать для дебага многопоточного? mt-gd или mt-sgd ?
Ardan, насколько я помню, примерно так:
s – статическая линковка
mt – мультитредед
d – дебаг
Соответственно, выбирайте тот вариант либы, который соответствует настройкам вашей программы (которые Вы задали в Project Settings).
Здравствуйте, прошу помочь в следующей ситуации:
1) необходимо подключить библиотеку поддерживающую функцию erf
2) на руках архив “boost_1_47_0″
3) я его распаковал на рабочий стол и запустил bootstrap
4) затем запустил появившиеся bjam и b2
5) при компиляции в условиях наличия в шапке выражения
“#include
using namespace boost;
#include ”
он(компилятор VS 2005) пишет
“error C3861: ‘erf': identifier not found”
6) по этой причине я начал хаотично копировать и вставлять как саму папку boost, так и отдельно erf.hpp в “C:\Program Files\Microsoft Visual Studio 8\VC\include” и в прочие части света
Ничего не вышло, в этой связи разъясните:
“… добавить эту папку в список папок билиотек Visual Studio. И в список папок-инклюдов добавить “ваша_папка_где_буст/boost” – там лежат инклюды буста, а в либы добавлем папку “где_лежит_буст/stage/lib”. На этом установка буста закончена и он готов к использованию…”
– как добавить в список папок библиотек, инклюдов (где в VS есть подобная клавиша-операция или их последовательность).
Папки stage и вовсе в архиве не существует
Прим. программа лежит в дирректории:
C:\Program Files\Microsoft Visual Studio 8\
Спасибо!
Добрый день.
1. Буст скомпилился нормально, без ошибок?
2. Вы инклюд того файла, где определены используемые Вами функции, делаете?
3. Папка появится когда буст _успешно_соберётся_ (точнее в процессе сборки)
4. Что бы добавить папку в список библиотек делаем так: главное меню > tools > options > projects and solutiuons > vc++ directories. Справа вверху в выпадающем списке выбираем “include files” (что бы указать пути к хидерам) либо “library files” (что бы указать пути к либам). Нажимаем кнопку с изображением папки (под выпадающим списком), вписываем в появившуюся строку полный путь. Нажимаем “ОК”. Готово.
5. Папки надо указывать не от того буста, который вы извлекли из архива, на ту папку, которая появилась на диске в процессе сборке (например, у меня она создаётся в корне диска и называется Boost – в ней при этом находятся все либы + хидеры и больше ничего лишнего).
Спасибо, однако видимо необходимо всё снести и заново поставить
1) буст скомпилировался без всяческих остановок и предупреждений
2) я указываю все возможные пути и файлы, которые хоть как-то связаны с предполагаемой к использованию функцией
3) хм…
4) всё зделал, спасибо за пошаговость
5) правда в 4 пункте я указал путь к разархивированному бусту, ибо другой одному богу известно куда разархивируется (у вас в корне, а у меня нет нигде, даже поиск наименования boost ничего не дал)
6) перезапустить установку буста пытался, но он тут же сворачивается (видно видит, что всё уже проинсталлировано)
Он ругается именно на то, что не может найти такую функцию?
Если так, то попробую предположить совсем уж очевидную вещь: быть может, Вы просто забыли указать: using namespace boost; либо надо вызывать функцию как boost::erf
Может быть, проблема в этом?
Скачал файл boost_1_47_0.zip и boost-jam-3.1.18-1-ntx86.zip. Разархивировал. Бросил файл файл bjam.exe в папку boost_1_47_0. Запустил используя ваш bat файл. Он мне пишет:
http://sf.net/project/showfiles.php?group_id=7586 ^&package_id=72941http://svn.boost.org
warning: mismatched versions of boost.build engine and core.
boost.build engine(bjam) is 03.1.18
boost.build core is 2011.04-svn
Удалил все распакованное. Разархивировал boost_1_47_0.zip. Пробовал запустить bootstrap.bat – пишет:
Failed to build Boost.Build engine.
Please consult bootstrap.log for furter diagnostics.
You can try to obtain a prebuilt binary from
Also, you can file an issue at
Please attach bootstrap.log in that case.
Собственно вопрос: Что теперь делать?
P.S. У меня Bolrand Builder 6.0 если это важно.
В бат-файле явно прописано, что для компиляции надо использовать VisualC++. Если Вы хотите сделать сборку под Bolrand Builder, то настройки надо поменять. По-моему как-то вот так должно выглядеть указание билдить под билдер:
bjam –toolset=borlandc
или вот так:
bjam –toolset=borland
При этом, насколько я помню, “свежие” версии (начиная то ли 1.3.3 то ли где-то там) не собираются под билдер. Хотя вот в этом могу ошибаться, просто билдером не пользуюсь ещё со времён выхода 5ой версии (т.е. лет 10 уже). Лучше всего в данном случае, наверное, будет обратиться к докам буста.
Думал не поставлю этот boost(, а нет. спасибо вообщем
У меня такой вопрос. После выполнения файла bootstrap.bat в окне появилось сообщение:
To build, run:
.\b2
и ниже ссылка на инструкцию на сайте boost, где написано, что нужно в этом случае использовать bjam. Как понять это противоречие?
Буст обновился, кажется осенью что ли. Сейчас процесс его установки упростился ещё больше – обратитесь к документации, он устанавливается буквально чуть ли не тремя кликами мыши )) Если будут проблемы – пишите, я попробую детально обрисовать процесс.
Добрый день. Застопорился я на установке boost 1.49, не могли бы вы описать процесс установки для MSVC 2010 express. Заранее благодарен.
Виталий, добрый день! Опишите, пожалуйста, какие именно проблемы возникают у Вас при установке boost?
во время компиляции буста в cmd пишется: системе не удалось найти указанный путь “cl” не является внутренней или внешней командой… тем не менее процесс продолжается и эта ошибка выводится офигэННОЕ количество раз, всё это длится 10 секунд, потом создаётся папка stage\lib но она пуста… (Win 7)
Господа, может хватит уже страдать хернёй (компилировать буст).
http://boost.teeks99.com/
Берите готовое и не мучайтесь.
При установки через b2 ошибка:
link.jam: no such file or directory
В одной из папок есть symlink.jam, а link.jam нет
Я начинающий в С++ работаю в линукс. среда Geany ,компилятор G++. Вот код:
#include
#include
int main(){
int A , B , C , D ;
std::cout<<"введем две дроби"<>A>>B>>C>>D;
boost::rational a(A, B), b(C, D);
std::cout << "a: " << a << "\nb: " << b << "\n";
std::cout << "a + b = " << (a + b) << "\n";
std::cout<<"a * b="<<(a*b)<<std::endl;
}
Код работает . Значит у меня буст подключен? Значит могу я пользоваться всеми функциями,что включены в буст? Или не могу? Дело в том что я пробовал запустить некоторые примеры в оф .сайта буста ,и не пошло. что вы посоветуете в этом случае? Спвсибо.
#include
#include
int main(){
int A , B , C , D ;
std::cout<<"введем две дроби"<>A>>B>>C>>D;
boost::rational a(A, B), b(C, D);
std::cout << "a: " << a << "\nb: " << b << "\n";
std::cout << "a + b = " << (a + b) << "\n";
std::cout<<"a * b="<<(a*b)<<std::endl;
} не полностью нарисовался код в предыдущем сообщении
помогите пожалуйста
кюте не видит буст
пишу
INCLUDEPATH += “C:\boost_1_55_0\boost”
LIBS += “C:/boost_1_55_0/stage/lib/libboost_wserialization-vc90-mt-gd-1_55.lib”
LIBS += “C:/boost_1_55_0/stage/lib/libboost_serialization-vc90-mt-1_55.lib”
компилю пример demo.cpp из библиотеки сериализации буста
ошибка undefined reference
Маленькая оговорка:
Добавлять в Additional Include Directories в студии нужно не “ваша_папка_где_буст/boost”, а корень, т.е. в данном случае “ваша_папка_где_буст”.
Собрал, только в stage/lib лежат файлы .a, как мне их слинковать в dll?
P.S. Собирал boost 1.59.0
.a ? У вас какая ОС? Linux/OSX?
Здравствуйте.
Собрал сборку через b2 с вашими параметрами, собираю проект в MVisual studio 2015 пишет ошибку, не может найти либ system140. Почему то её нет в папке state/lib
1. папка не state, а stage
2. проверьте, есть ли такая либа в данной папке
3. если нет – запустите сборку буста ещё раз (повторно – она сработает в десятки раз быстрее)и посмотрите не пишет ли в консоль ошибки, возможно просто чего-то не смогло найти при сборке и потому не собралось.
Доброго времени суток! Все прошло хорошо, после запуска bjam.exe создалась папка stage, а в ней есть библиотеки. Все, кроме нужной мне. А нужна мне asio. Подскажите пожалуйста, что я не так делаю и где взять boost::asio?
Смотрите логи билда – возможно, у вас он отключен или не получилось собрать, или какие-то ошибки сборки.