Этот гайд посвящен установке библиотеки под названием Boost и тому, как правильно ее подключить к нашей программе.
Переходим на этот сайт и в строке “unix” выбираем подстроку “boost_1_82_0.tar.bz2”. Начинается загрузка.
После того, как архив скачался, нам надо узнать полный путь до с этого архива. Скорее всего это /Users/имя_вашего_пользователя/Downloads/boost_1_82_0.tar.bz2
, но проверим наверняка. Заходим в ту папку, куда скачался архив. Нажимаем правой кнопкой мыши по архиву (или двумя пальцами по тачпаду), чтобы открылось контекстное меню. Как только оно открылось — зажимаем клавишу “option” и жмем на кнопку “Скопировать путь до boost_1_82_0.tar.bz2” (она появится вместо кнопки “Скопировать” как только вы нажмете клавишу “option”).
ЗАПОМИНАЕМ ЭТОТ ПУТЬ ИЛИ КОПИРУЕМ ЕГО КУДА-НИБУДЬ!
Теперь нам необходимо выбрать место, куда вы хотите его распаковать. Я создам папку “boost2” в папке своего пользователя (полный путь: /Users/имя_вашего_пользователя/boost2
).
Таким же образом, как и для архива, узнаем полный путь до папки и копируем его.
После этого открываем терминал (cmd + пробел, затем там вводим “terminal”). В нем мы пишем следующую команду:
cd /путь_до_папки_где_будете_распаковывать_архив
Вот как это должно выглядеть:
Теперь, не отходя от кассы, тут же прописываем следующую команду:
tar --bzip2 -xf /путь_до_файла_boost_1_82_0.tar.bz2
У меня эта команда будет выглядеть так:
Нажимаем “Ок”, если терминал попросит доступ к папке “Загрузки”. После непродолжительного момента времени выполнение команды завершится и вы сможете лицезреть в вашей папке другую папку с названием “boost_1_82_0”.
Заходим обратно в терминал и пишем следующие команды:
cd boost_1_82_0 # переходим в папку с этим именем
code . # открываем в VS Code содержимое текущей директории
У вас откроется VS Code со всем содержимым этой библиотеки.
Создаем в этой директории файл, например, 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" );
}
Заходим обратно в терминал и начинаем сборку нашего файла следующей командой:
clang++ example.cpp -o example -I /путь_до_папки_boost_1_82_0 # компилируем .cpp файл в исполняемый с именем "example" и указав флагом -I путь до инклюдов
./example # запускаем исполняемый файл
После этого вы сможете вводить в терминал числа и получать на выходе то же число, но умноженное на 3. Завершить программу можно закрыв терминал или отправив вместо числа любую букву.
Примечание! Файл с программой необязательно создавать в папке boost_1_82_0. Это можно сделать в любом другом месте. Отличие лишь в том, какой путь указывать флагом -I
. Так, если наша программа лежит в папке boost_1_82_0, то абсолютный путь до этой папки можно было бы заменить относительным:
clang++ example.cpp -o example -I . # точка означает текущую директорию
./example
Теперь немного теории. Дело в том, что большинство модулей в библиотеке Boost написано с использованием только заголовочных файлов (формата .h
и .hpp
). Это значительно упрощает сборку проекта, так как их достаточно просто положить в папку с вашим проектом (или указать в настройках дополнения C/C++ в VS Code путь до этих заголовочных файлов) и подключить непосредственно во время работы, указав путь флагом -I
во время компиляции. Однако есть список модулей, которые используют так называемые динамические библиотеки при сборке (формат .dylib
). Вот их список:
Они собираются отдельно и “линкуются” непосредственно во время сборки. Наша задача состоит в том, чтобы собрать все эти библиотеки отдельным скриптом, который уже лежит в папке 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”.
Теперь в файле 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 секунду.
Готово! Библиотека установлена, связи между динамическими модулями тоже есть, а значит мы можем подключить любой такой модуль флагом -lboost_че-то-там
.
Спасибо за внимание. По любым вопросам обращайтесь в tg: comrademashkov.
Building 1