Skip to content

Instantly share code, notes, and snippets.

@ComradeMashkov
Last active October 31, 2023 14:01
Show Gist options
  • Save ComradeMashkov/95c91c971da462afaf30be5f006f67d1 to your computer and use it in GitHub Desktop.
Save ComradeMashkov/95c91c971da462afaf30be5f006f67d1 to your computer and use it in GitHub Desktop.

[Windows] Как установить библиотеку Boost и подключить ее?

Этот гайд посвящен установке библиотеки под названием Boost и тому, как правильно ее подключить к нашей программе.

Установка библиотеки Boost на Windows

1. Загрузка библиотеки

Переходим на этот сайт и в строке “windows” выбираем подстроку “boost_1_82_0.7z” (или “boost_1_82_0.zip”). Начинается загрузка.

Untitled

После того, как архив скачался, распаковываем его в любом удобном месте, я выберу следующий путь: C:\Program Files\boost\boost_1_82_0

Untitled

2. Сборка простого проекта

Заходим в терминал Git Bash и пишем следующие команды:

cd C:/Program\ Files/boost/boost_1_82_0 # переходим 
code . # открываем в VS Code содержимое текущей директории 

Untitled

У вас откроется VS Code со всем содержимым этой библиотеки.

Untitled

Создаем в этой директории файл, например, example.cpp и вставляем в него следующий код (ОБЯЗАТЕЛЬНО потом нажимаем ctrl + S, чтобы сохранить файл):

#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator<int> in;

    std::for_each(
        in(std::cin), in(), std::cout << (_1 * 3) << " \n" );
}

Untitled

Заходим обратно в терминал и начинаем сборку нашего файла следующей командой:

g++ example.cpp -o example -I путь_до_папки_boost_1_82_0 # компилируем .cpp файл в исполняемый с именем "example" и указав флагом -I путь до инклюдов
./example.exe # запускаем исполняемый файл

После этого вы сможете вводить в терминал числа и получать на выходе то же число, но умноженное на 3. Завершить программу можно закрыв терминал или отправив вместо числа любую букву.

Untitled

Примечание! Файл с программой необязательно создавать в папке boost_1_82_0. Это можно сделать в любом другом месте. Отличие лишь в том, какой путь указывать флагом -I. Так, если наша программа лежит в папке boost_1_82_0, то абсолютный путь до этой папки можно было бы заменить относительным:

g++ example.cpp -o example -I . # точка означает текущую директорию
./example.exe

3. Сборка более сложного проекта

Теперь немного теории. Дело в том, что большинство модулей в библиотеке Boost написано с использованием только заголовочных файлов (формата .h и .hpp). Это значительно упрощает сборку проекта, так как их достаточно просто положить в папку с вашим проектом (или указать в настройках дополнения C/C++ в VS Code путь до этих заголовочных файлов) и подключить непосредственно во время работы, указав путь флагом -I во время компиляции. Однако есть список модулей, которые используют так называемые динамические библиотеки при сборке (формат .dll). Вот их список:

Снимок экрана 2023-10-25 в 17.29.42.png

Они собираются отдельно и “линкуются” непосредственно во время сборки. Наша задача состоит в том, чтобы собрать все эти библиотеки отдельным скриптом, который уже лежит в папке boost_1_82_0, а затем “слинковать” их с исполняемым файлом.

3.1. Обновляем gcc

Перед использованием утилиты bootstrap, нам необходимо обновиться. Дело в том, что самый удобный установщик gcc (mingw-get) канул в 2016 году и с тех пор не обновлялся, а последние версии Boost уже ушли далеко за стандарты 2016 года. Как вариант — использовать компилятор MSVC, но мало у кого он установлен (а жаль).

Поэтому вступаем в новый круг ада под названием “Программирование на C++ под Windows” или “Почему я ненавижу MinGW”. Переходим по этой ссылке и качаем архивчик. Заходим в архив и первые 5 папок (bin, include, lib, libexec, share) переносим с заменой туда, где у вас установлен MinGW (у меня это C:/MinGW). Затем открываем в этом архиве папку mingw64/x86_64-w64-mingw32 и все папки, которые находятся там, переносим с заменой в ту же папку MinGW. Подтверждаем замену.

П Е Р Е З А Г Р У Ж А Е М С Я!

3.2. Финал

Приступим к финальной части. Нам надо перейти в папку boost_1_82_0 и оттуда запустить скрипт:

cd путь_до_папки_boost_1_82_0 # переходим в папку boost_1_82_0
./bootstrap.bat gcc # запускаем скрипт для создания исполняемого файла сборки
# ... пойдет недолгий процесс ...
./b2.exe toolset=gcc --with-thread # выбираем gcc'шный тулсет и задаем префикс на установку только либы thread (иначе мы никогда не дождемся сборки)
# ... пойдет недолгий процесс ...
# .............................
# дождитесь окончания сборки

Теперь в файле example.cpp из предыдущего пункта пишем следующий код:

#include <boost/thread.hpp>
#include <iostream>

void wait(int seconds)
{ 
  boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}

void thread()
{
  for(int i = 0; i < 5; ++i)
  {
    wait(1);
    std::cout << i << std::endl;
  }
}

int main() 
{
  boost::thread t(thread);
  t.join();
}

Теперь мы можем скомпилировать все это дело

g++ example.cpp -o example -I . stage/lib/libboost_thread-mgw13-mt-d-x64-1_82.a # ненавижу gcc
./example.exe # поехали!

Результатом станет вывод чисел от 0 до 4 с задержкой в 1 секунду.

Untitled

Готово! Библиотека установлена. Чтобы использовать другие библиотеки, надо собрать новый исполняемый файл сборки и явно указать нужный модуль. Поверьте, так быстрее, чем ждать сборки всех модулей сразу.

cd путь_до_папки_boost_1_82_0 
./b2.exe toolset=gcc --with-название-модуля 

Модули затем находим по пути путь_до_папки_boost_1_82_0/stage/lib и используем их названия.

Спасибо за внимание. По любым вопросам обращайтесь в tg: comrademashkov.

@ComradeMashkov
Copy link
Author

ComradeMashkov commented Oct 28, 2023

Building 2

Untitled

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment