Skip to content

Instantly share code, notes, and snippets.

@ComradeMashkov
Last active October 28, 2023 15:51
Show Gist options
  • Save ComradeMashkov/b570af5a9c60b3774d16bc43515b38da to your computer and use it in GitHub Desktop.
Save ComradeMashkov/b570af5a9c60b3774d16bc43515b38da to your computer and use it in GitHub Desktop.

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

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

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

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

Переходим на этот сайт и в строке “unix” выбираем подстроку “boost_1_82_0.tar.bz2”. Начинается загрузка.

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

После того, как архив скачался, нам надо узнать полный путь до с этого архива. Скорее всего это /Users/имя_вашего_пользователя/Downloads/boost_1_82_0.tar.bz2, но проверим наверняка. Заходим в ту папку, куда скачался архив. Нажимаем правой кнопкой мыши по архиву (или двумя пальцами по тачпаду), чтобы открылось контекстное меню. Как только оно открылось — зажимаем клавишу “option” и жмем на кнопку “Скопировать путь до boost_1_82_0.tar.bz2” (она появится вместо кнопки “Скопировать” как только вы нажмете клавишу “option”).

ЗАПОМИНАЕМ ЭТОТ ПУТЬ ИЛИ КОПИРУЕМ ЕГО КУДА-НИБУДЬ!

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

Теперь нам необходимо выбрать место, куда вы хотите его распаковать. Я создам папку “boost2” в папке своего пользователя (полный путь: /Users/имя_вашего_пользователя/boost2).

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

Таким же образом, как и для архива, узнаем полный путь до папки и копируем его.

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

После этого открываем терминал (cmd + пробел, затем там вводим “terminal”). В нем мы пишем следующую команду:

cd /путь_до_папки_где_будете_распаковывать_архив

Вот как это должно выглядеть:

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

Теперь, не отходя от кассы, тут же прописываем следующую команду:

tar --bzip2 -xf /путь_до_файла_boost_1_82_0.tar.bz2

У меня эта команда будет выглядеть так:

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

Нажимаем “Ок”, если терминал попросит доступ к папке “Загрузки”. После непродолжительного момента времени выполнение команды завершится и вы сможете лицезреть в вашей папке другую папку с названием “boost_1_82_0”.

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

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

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

cd boost_1_82_0 # переходим в папку с этим именем
code . # открываем в VS Code содержимое текущей директории

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

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

Создаем в этой директории файл, например, example.cpp и вставляем в него следующий код (ОБЯЗАТЕЛЬНО потом нажимаем cmd + 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" );
}

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

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

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

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

Снимок экрана 2023-10-27 в 06.52.44.png

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

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

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

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

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

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

Важно: устанавливать эти библиотеки надо в корень системы, то есть в папку /usr/local.

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

cd /путь_до_папки_boost_1_82_0 # переходим в папку boost_1_82_0
sudo ./bootstrap.sh --prefix=/usr/local # запускаем скрипт сборки
# ... тут вы должны ввести пароль ...
# ... пойдет недолгий процесс ...
sudo ./b2 install # устанавливаем исходники
# ... тут пароль вводить не надо ...
# ... пойдет долгий процесс ...

Если вы все сделали правильно, то в папке /usr/local появятся папки “include” и “lib”.

Снимок экрана 2023-10-27 в 07.18.15.png

Теперь в файле 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();
}

Так как библиотеку мы поставили в корень (/usr/local), то мы можем скомпилировать программу следующим образом (не указывая явно инклюды):

clang++ example.cpp -o example -std=c++17 -lboost_thread # однако модуль thread указать надо
./example # поехали!

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

Снимок экрана 2023-10-27 в 07.27.56.png

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

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

@ComradeMashkov
Copy link
Author

Building 1

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-10-25%20%D0%B2%2017 13 40

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-10-25%20%D0%B2%2017 21 18

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-10-27%20%D0%B2%2006 52 44

@ComradeMashkov
Copy link
Author

Building 2

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-10-25%20%D0%B2%2017 29 42

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-10-27%20%D0%B2%2007 18 15

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-10-27%20%D0%B2%2007 27 56

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