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-jam-3.1.18-1-ntx86.zip. У цьому архіві знаходиться файл bjam.exe. його треба помістити в якусь папку, яка прописана в системі в змінної% PATH%. Я зазвичай кидаю його в C: / Windows /
Є і більш правильний спосіб: просто запустіть в папці boost'а файлик bootstrap.bat - він збере для вас bjam останньої версії, це надійніше і більш правильно.
Що б подивитися всі доступні опції збірки треба ввести команду:
До початку збирання самого буста подбайте про те, що б на диску було вільно хоча б 3-4 гігабайти вільного місця. Ага, буст це штука немаленька. Однак, не хвилюйтеся - коли ви будете збирати свої програми з використанням буст, вони не будуть розростатися до гігабайтних розмірів - просто буст збирає всі бібліотеки в купі різних варіантів (лінковки), та й потім, при складанні ваших програм, в них будуть додаватися лише реально використовувані вами функції буста, а зовсім не вся бібліотека. Якщо якісь з варіантів компонування ви не збираєтеся використовувати ніколи - ви можете відключити їх компіляцію і тоді збірка буста пройде значно швидше. Однак, ніколи наперед не знаєш, знадобитися воно чи ні, тому краще скомпілювати все - нехай буде, зайвим не буде.
Отже, давайте запустимо збірку:
Я відключив Сорк буст- пітон, тому що він нам не потрібен. Якщо вам він потрібен і пітон (включаючи вихідні та ліби) коштує у вас на компі - Не вимикайте його.
Тепер можна налити собі каву, включити улюблений серіал і довго-довго дивитися його ... Процес компіляції буста дуже (ну дуууже) не швидкий. Я вас дуже прошу - зробіть збірку буста самі, не намагайтеся знайти де скачати її в мережі - навіть якщо ви зможете знайти, є дуже велика ймовірність, що вона у вас просто не зработает ...
Під час компіляції може сипатися задоволеного багато Варнінг - просто не звертайте на них уваги - збірка все одно повинна пройти успішно.
Залежно від потужності вашого комп'ютера, десь через 20-60 хвилин збірка буста закінчиться. В папці boost'а з'явиться нова папка "stage / libs" - в ній лежать всі зібрані бібліотеки буста.
Підключення Boost до Visual C ++
Залишилося тільки додати цю папку в список папок біліотеку Visual Studio. І в список папок-інклюд додати "ваша_папка_где_буст / boost" - там лежать інклюд буста, а в ліби додано папку "где_лежіт_буст / stage / lib". На цьому установка буста закінчена і він готовий до використання. Що б переконатися в цьому, ви можете взяти будь-який приклад з сайту boost'а і спробувати його скомпілювати.
Цей урок закінчений. У наступному уроці я розповім вам про те, як поставити і налаштувати luabind, який сильно спростить нам життя, а точніше дозволить більш просто використовувати lua -скріпти в наших програмах.
Ще по цій темі:
Just guest пише:
у вас дуже хороші уроки.
Не знав, куди написати це питання. Швидше підходить під тему boost. Я розумію, що рішення в проектуванні сильно залежать від завдання, але все ж цікаво, як ви чините в наступному випадку.
Є деяке сховище персонажів. Дерево або просто список. І раптом нам захотілося зробити відносини між ними. Ставлення один до одного. Як краще вчинити? Хороші книги по C ++ так хвалять інтелектуальні покажчики, що звичайними аж страшно користуватися часом.
typedef boost :: weak_ptr CharacterPtr;
struct rel
std :: pair link;
int value; // власне структура для того, щоб ми могли в будь-якому випадку підключити сюди не просто числове значення
>
/////
Це правильно? Тобто статичну виділення пам'яті краще не використовувати? Або можна було просто створити std :: vector і покажчики Character *?
І дурне питання: shared_ptr, який вказує на статично виділену пам'ять - це біда?
Просто при проектуванні в багатьох місцях виходить так, і мене це трохи турбує.
Just guest пише:
Ой, забув, що теги ріжуться. Не знаю, як краще, напишу так тоді (квадратні дужки замість кутових):
typedef boost :: weak_ptr] Character [CharacterPtr;
struct rel
std :: pair] CharacterPtr, CharacterPtr [link;
"Або можна було просто створити std :: vector] Character [і покажчики Character *?
Просто vector Вам однозначно не підійде - при додаванні нових чаров, вектор може перенести свої дані в нову ділянку пам'яті (релокацію даних при нестачі поточної зарезервованої вектором пам'яті) і тоді всі ваші покажчики стануть недійсними, що, в найкращому випадку, призведе просто до помилок , а, швидше за все, до падіння програми.
Тому, якщо Ви плануєте десь використовувати покажчики на ваших чаров (не важливо - розумні чи ні), то вектор слід зберігати покажчики (або звичайні, або розумні).
При цьому, якщо у Вас може виникнути ситуація, коли якийсь із чаров був видалений, але на нього можуть посилатися інші чари - Вам однозначно варто зберігати в векторі shared_ptr'и, а для посилань на цих чаров з інших персів, використовувати, наприклад , слабкі покажчики (weak_ptr).
Принаймні на перший погляд такий підхід мені бачиться найбільш розумним.
Just guest пише:
> При додаванні нових чаров, вектор може перенести свої дані в нову ділянку пам'яті
Чорт, точно, все як завжди на поверхні. Велике дякую.
А 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 "
Нічого не вийшло, в зв'язку з цим роз'ясніть:
"... додати цю папку в список папок біліотеку 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
Може бути, проблема в цьому?
У бат-файлі явно прописано, що для компіляції треба використовувати VisualC ++. Якщо Ви хочете зробити збірку під Bolrand Builder, то настройки треба поміняти. По-моєму якось ось так має виглядати вказівку білд під билдер:
bjam -toolset = borlandc
або ось так:
bjam -toolset = borland
При цьому, наскільки я пам'ятаю, "свіжі" версії (починаючи чи то 1.3.3 чи десь там) не збираються під билдер. Хоча ось в цьому можу помилятися, просто билдер не користуюся ще з часів виходу 5ой версії (тобто років 10 вже). Найкраще в даному випадку, напевно, буде звернутися до доків буста.
Я початківець в С ++ працюю в лінукс. Середа 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: " < std :: cout <<"a + b = " <<(a + b) <<"\n";
std :: cout<<"a * b="<<(a*b)<
Код працює. Значить у мене буст підключений? Значить можу я користуватися всіма функціями, що включені в буст? Або не можу? Справа в тому що я пробував запустити деякі приклади в оф .сайта буста, і не пішла. Як би Ви оцінили в цьому випадку? Спвсібо.
#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: " < std :: cout <<"a + b = " <<(a + b) <<"\n";
std :: cout<<"a * b="<<(a*b)<
Допоможіть будь ласка
кюте не бачить буст
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", а корінь, тобто в даному випадку "ваша_папка_где_буст".