Страница 1 из 2

Boost

Добавлено: 30 мар 2013, 15:02
Olej
Про Boost уже был начат разговор в теме независимый от платформы код. Но вопросы переносимости - это только одна из сторон Boost, не касающаяся его применения (кому-то из использующих Boost его переносимость и вовсе может быть "до фени").

Кроме того, вопросы использования Boost были обстоятельно затронуты ещё в одной теме - исполнение промышленных проектов под Wine (там он использовался как инструмент для примеров кода): откуда взять?, как установить? (разные варианты), где документация?, как начать использовать?

Ещё Boost затрагивался в теме о языке Clang, потому как Boost и Clang очень ... соответствуют дуг другу.

Но Boost как инструмент вполне заслуживает своей отдельной темы для обсуждений и ссылок.

Re: Boost

Добавлено: 30 мар 2013, 15:29
Olej
Olej писал(а):откуда взять?, как установить? (разные варианты), где документация?, как начать использовать?
Повторю, чтоб всё в одно место:

1. сайт проекта Boost;

2. описания как скачать, установить и проверить: Getting Started on Windows и Getting Started on Unix Variants;

3. ... но пред.п.(№2) - это если а). вы обязательно хотите только самый последний Boost + б). вы хотите возиться со сборкой и компиляцией библиотек Boost (потому, что для большинства случаев нужны именно бинарные библиотеки Boost, а их нужно строить их исходников). Можно вполне установить Boost из пакетного репозитария вашего дистрибутива Linux (везде есть), например:

Код: Выделить всё

[root@notebook etc]# yum install boost*
...
После чего проверим сбоку любого приложения с указанием библиотек, ... например такого простейшего приложения (которое без библиотек не соберётся):

Код: Выделить всё

#include <iostream>
#include <boost/filesystem.hpp>
using namespace boost::filesystem;

int main(int argc, char* argv[]) {
  if (argc < 2) {
    std::cout << "Usage: tut1 path\n";
    return 1;
  }
  std::cout << argv[1] << " " << file_size(argv[1]) << '\n';
  return 0;
}
Команда сборки:

Код: Выделить всё

[root@notebook test]# c++ tut1.cpp -o tut1 -L /usr/lib -l boost_filesystem-mt -l boost_system-mt
А имена библиотек Boost, которые могут вам понадобиться для сборки того или иного приложения - смотрим здесь:

Код: Выделить всё

[root@notebook lib]# ls libboost*
libboost_chrono.a                 libboost_math_c99.so                    libboost_regex.so
libboost_chrono-mt.a              libboost_math_c99.so.1.48.0             libboost_regex.so.1.48.0
libboost_chrono-mt.so             libboost_math_tr1.a                     libboost_serialization.a
libboost_chrono-mt.so.1.48.0      libboost_math_tr1f.a                    libboost_serialization-mt.a
libboost_chrono.so                libboost_math_tr1f-mt.a                 libboost_serialization-mt.so
libboost_chrono.so.1.48.0         libboost_math_tr1f-mt.so                libboost_serialization-mt.so.1.48.0
libboost_date_time.a              libboost_math_tr1f-mt.so.1.48.0         libboost_serialization.so
libboost_date_time-mt.a           libboost_math_tr1f.so                   libboost_serialization.so.1.48.0
libboost_date_time-mt.so          libboost_math_tr1f.so.1.48.0            libboost_signals.a
libboost_date_time-mt.so.1.48.0   libboost_math_tr1l.a                    libboost_signals-mt.a
libboost_date_time.so             libboost_math_tr1l-mt.a                 libboost_signals-mt.so
libboost_date_time.so.1.48.0      libboost_math_tr1l-mt.so                libboost_signals-mt.so.1.48.0
libboost_filesystem.a             libboost_math_tr1l-mt.so.1.48.0         libboost_signals.so
libboost_filesystem-mt.a          libboost_math_tr1l.so                   libboost_signals.so.1.48.0
libboost_filesystem-mt.so         libboost_math_tr1l.so.1.48.0            libboost_system.a
libboost_filesystem-mt.so.1.48.0  libboost_math_tr1-mt.a                  libboost_system-mt.a
libboost_filesystem.so            libboost_math_tr1-mt.so                 libboost_system-mt.so
libboost_filesystem.so.1.48.0     libboost_math_tr1-mt.so.1.48.0          libboost_system-mt.so.1.48.0
libboost_graph-mt.so              libboost_math_tr1.so                    libboost_system.so
libboost_graph-mt.so.1.48.0       libboost_math_tr1.so.1.48.0             libboost_system.so.1.48.0
libboost_graph.so                 libboost_prg_exec_monitor.a             libboost_test_exec_monitor.a
libboost_graph.so.1.48.0          libboost_prg_exec_monitor-mt.a          libboost_test_exec_monitor-mt.a
libboost_iostreams.a              libboost_prg_exec_monitor-mt.so         libboost_thread-mt.a
libboost_iostreams-mt.a           libboost_prg_exec_monitor-mt.so.1.48.0  libboost_thread-mt.so
libboost_iostreams-mt.so          libboost_prg_exec_monitor.so            libboost_thread-mt.so.1.48.0
libboost_iostreams-mt.so.1.48.0   libboost_prg_exec_monitor.so.1.48.0     libboost_timer.a
libboost_iostreams.so             libboost_program_options.a              libboost_timer-mt.a
libboost_iostreams.so.1.48.0      libboost_program_options-mt.a           libboost_timer-mt.so
libboost_locale-mt.so             libboost_program_options-mt.so          libboost_timer-mt.so.1.48.0
libboost_locale-mt.so.1.48.0      libboost_program_options-mt.so.1.48.0   libboost_timer.so
libboost_math_c99.a               libboost_program_options.so             libboost_timer.so.1.48.0
libboost_math_c99f.a              libboost_program_options.so.1.48.0      libboost_unit_test_framework.a
libboost_math_c99f-mt.a           libboost_python.a                       libboost_unit_test_framework-mt.a
libboost_math_c99f-mt.so          libboost_python-mt.a                    libboost_unit_test_framework-mt.so
libboost_math_c99f-mt.so.1.48.0   libboost_python-mt.so                   libboost_unit_test_framework-mt.so.1.48.0
libboost_math_c99f.so             libboost_python-mt.so.1.48.0            libboost_unit_test_framework.so
libboost_math_c99f.so.1.48.0      libboost_python.so                      libboost_unit_test_framework.so.1.48.0
libboost_math_c99l.a              libboost_python.so.1.48.0               libboost_wave-mt.a
libboost_math_c99l-mt.a           libboost_random.a                       libboost_wave-mt.so
libboost_math_c99l-mt.so          libboost_random-mt.a                    libboost_wave-mt.so.1.48.0
libboost_math_c99l-mt.so.1.48.0   libboost_random-mt.so                   libboost_wserialization.a
libboost_math_c99l.so             libboost_random-mt.so.1.48.0            libboost_wserialization-mt.a
libboost_math_c99l.so.1.48.0      libboost_random.so                      libboost_wserialization-mt.so
libboost_math_c99-mt.a            libboost_random.so.1.48.0               libboost_wserialization-mt.so.1.48.0
libboost_math_c99-mt.so           libboost_regex-mt.so                    libboost_wserialization.so
libboost_math_c99-mt.so.1.48.0    libboost_regex-mt.so.1.48.0             libboost_wserialization.so.1.48.0
4. Исчерпывающая документация на Boost (на том же сайте Boost, но она заслуживает отдельного упоминания).

5. Русскоязычные (это большая редкость) переводы и примеры по Boost: Библиотека BOOST C++ - список компонентов - это что-то из сообщества Sun Solaris.

6. Русскоязычная страница wiki по Boost - здесь есть короткие примеры кода по разным разделам Boost для самого начала.

7. Моё описание (впечатлений ;-) ) того, как я установил Boost ver.1.53 (самый свежий) в Windows XP под использование в Visual Studio 2010 - процесс отличается от того, как описывается инсталляция на сайте Boost (Windows - это для тех, кто хочет проверять переносимость своего ПО между системами - нужна такая эталонная установка).

Re: Boost

Добавлено: 30 мар 2013, 17:49
Виктория
5. Русскоязычные (это большая редкость) переводы и примеры по Boost: Библиотека BOOST C++ - список компонентов - это что-то из сообщества Sun Solaris.
Документация неполная, по нужным функциям лишь примеры :-(

А какие компоненты boost самые основные, если ориентироваться на критерий переносимости?
Asio можно отнести к минимальному набору? http://think-async.com/Asio/AsioAndBoostAsio
Таймеры высокого разрешения нужны?

Re: Boost

Добавлено: 30 мар 2013, 17:54
Виктория
Статья про Asio -
Boost.Asio, шаблон «Активный объект» и многопоточные приложения

Учебный курс ЮФУ http://bravit.rsu.ru/distrib/Asio_tutor ... to_sockets

З.Ы.: может быть немного не в тему, попалась старая статья с SoftCraft - SoftCraft: процессы вместо классов?

Re: Boost

Добавлено: 30 мар 2013, 18:30
Виктория
Olej писал(а):
Olej писал(а):откуда взять?, как установить? (разные варианты), где документация?, как начать использовать?
...
7. Моё описание (впечатлений ;-) ) того, как я установил Boost ver.1.53 (самый свежий) в Windows XP под использование в Visual Studio 2010 - процесс отличается от того, как описывается инсталляция на сайте Boost (Windows - это для тех, кто хочет проверять переносимость своего ПО между системами - нужна такая эталонная установка).
Ох уж этот Visual Studio 2010! Версия 1.52 тестировалась и для MinGW 4.4.0, 4.4.7, 4.5.4, 4.6.3, 4.7.0 и для Visual C++!!!

Re: Boost

Добавлено: 30 мар 2013, 18:37
Olej
Виктория писал(а):
5. Русскоязычные (это большая редкость) переводы и примеры по Boost: Библиотека BOOST C++ - список компонентов - это что-то из сообщества Sun Solaris.
Документация неполная, по нужным функциям лишь примеры :-(
А по этому п. примеры и есть самое интересное, что там есть.
А исчерпывающая документация (англоязычная) названа пред. п. №4 ;-)

P.S. Где-то я читал мнение, что по Boost нет толком на русском языке ни переводов документации, ни описаний, ни книг.
Так что, как ни крути, - нужно пользоваться оригинальной документацией.

Re: Boost

Добавлено: 30 мар 2013, 19:13
Olej
Виктория писал(а): А какие компоненты boost самые основные, если ориентироваться на критерий переносимости?
Это, как и во всём - кому что надо.
- кому-то интереснее "функциональные теоретизирования" ;-) - Lambda
- кому-то математические разделы, например, специальные функции - Math/Special Functions (а в Boost на сегодня аж 5 математических разделов) ... а кому-то вся эта математика - до фени ;-)

А если говорить только о нуждах переносимости (но это не самая главная сторона Boost), то, я так думаю:

* 1-й эшелон необходимости (то, что в разных системах реализовано диаметрально по-разному - без этого переносимости просто не достичь):
- Thread - Portable C++ multi-threading
- Signals - Managed signals & slots callback implementation
- Timer - Event timer, progress timer, and progress display classes
- Locale - Provide localization and Unicode handling tools for C++
- Interprocess - Shared memory, memory mapped files, process-shared mutexes, condition variables, containers and allocators

* 2-й эшелон необходимости (то, что хотелось бы сделать единообразным):
- Pool - Memory pool management
- Program Options - The program_options library allows program developers to obtain program options, that is (name, value) pairs from the user, via conventional methods such as command line and config file.
- Chrono - Useful time utilities

* и только потом уже то, что есть только средством для удобства:
- Iostreams - Boost.IOStreams provides a framework for defining streams, stream buffers and i/o filters
- Asio - Portable networking, including sockets, timers, hostname resolution and socket iostreams
- Date Time - A set of date-time libraries based on generic programming concepts
- Filesystem - The Boost Filesystem Library provides portable facilities to query and manipulate paths, files, and directories

А вся остальная, наибольшая часть разделов Boost вообще к переносимости никакого отношения не имеет.
Виктория писал(а):Asio можно отнести к минимальному набору? http://think-async.com/Asio/AsioAndBoostAsio
Я вам своё мнение на этот счёт написал выше, но это только исключительно IMHO.
P.S. Но именно в Asio есть компонент, незаменимый для переносимости, то, что делает UNIX системы именно UNIX - а именно fork().
Вот некоторые важнейшие примеры из документации по этой части:
Fork
daemon.cpp
process_per_connection.cpp
fork() - это именно то единственное, что позволило UNIX обставить Windows в многодесятилетней гонке ;-)

Re: Boost

Добавлено: 30 мар 2013, 20:05
Виктория
Лучше ориентироваться на минимум, если можно будет обойтись первым эшелоном, то зачем тащить лишнее...

И так уже очень много документации - для "воскресного чтения" :oops:
А все функции POSIX можно реализовать за счет первого эшелона?

Re: Boost

Добавлено: 30 мар 2013, 22:42
Olej
Виктория писал(а):А все функции POSIX можно реализовать за счет первого эшелона?
Нельзя так говорить "все функции POSIX" - это не функции POSIX, а эквивалентные им возможности, однородные для программы в любой ОС. Хотя в каждой из этих ОС возможности эти могут реализовываться совершенно разными механизмами - их собственным API (самый показательный здесь пример - fork() для Windows). Эти (посвящённые переносимости) разделы Boost - это обёртки, промежуточный слой над ОС.

А для того, чтобы все возможности, описываемые POSIX, были доступны - к "первому эшелону" добавьте (обязательно!) fork() (из Asio). И на этом, похоже, всё... ;-)

Re: Boost

Добавлено: 30 мар 2013, 22:58
Olej
Olej писал(а): - кому-то интереснее "функциональные теоретизирования" ;-) - Lambda
Вообще то, программирование, особенно С++, во многом перешло в фазу "игры разума" - пустые формализмы на уровне головоломок ... для реальной дисциплины "программирование" абсолютно не нужные ... сродни тому, что описано в романе Германа Гессе "Игра в бисер" (нобелевская премия). Это не специально и по случаю сказано относительно Boost, а по отношению к С++ вообще ... Boost просто вобрал в себя худшее из C++ :lol:

Смотрите, несколько сравнительных вариантов по мотивам lambda-функций:

- общий заголовочный файл lambda.h (чтоб не тащить между разными вариантами):

Код: Выделить всё

#include <cstdlib>
#undef _GLIBCXX_ATOMIC_BUILTINS
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
vector<int> a( 13, 11 );


А теперь дальше смотрим 3 варианта реализации одного и того же действа:

- совершенно ординарная реализация средствами STL (чтоб было понятно о чём ведём речь), lambstl.cc :

Код: Выделить всё

#include "lambda.h"

void func( int parameter ) {
   std::cout << parameter << ' ';
};

int main ( int argc, char **argv ) {
   std::for_each( a.begin(), a.end(), func );
   std::cout << std::endl;
   exit( EXIT_SUCCESS );
}
- реализация С++ в стандарте 2011г., lambcpp11.cc :

Код: Выделить всё

#include "lambda.h"

int main ( int argc, char **argv ) {
   auto const local = [&]( int parameter ) {
      cout << parameter << ' ';
   };
   for_each( a.begin(), a.end(), local );
   cout << endl;
   exit( EXIT_SUCCESS );
}
- реализация средствами Boost, раздел Lambda (анонимные функции), lamboost.cc :

Код: Выделить всё

#include "lambda.h"
#include <boost/lambda/lambda.hpp>
using namespace boost::lambda;

int main ( int argc, char **argv ) {
   for_each( a.begin(), a.end(), cout << _1 << ' ' );
   cout << endl;
   exit( EXIT_SUCCESS );
}
Согласитесь, что две последние записи - это что-то промежуточное между маразмом и паранойей;-)

А выполнение для всех вариантов идентичное:

Код: Выделить всё

bash-4.2$ make
c++ lambstl.cc -o lambstl
c++ -std=c++11 lambcpp11.cc -o lambcpp11
c++  lamboost.cc -o lamboost

bash-4.2$ ./lambstl
11 11 11 11 11 11 11 11 11 11 11 11 11

bash-4.2$ ./lambcpp11
11 11 11 11 11 11 11 11 11 11 11 11 11 

bash-4.2$ ./lamboost
11 11 11 11 11 11 11 11 11 11 11 11 11
Как вам такое нравится? ;-)