Jak zbudować bibliotekę Boost C++

Jest to biblioteka będąca potocznie nazywaną „standard 2.0 dla C++”, albo „poczekalnia do standardu C++”. Umożliwia bardzo wiele rzeczy, które robi się przy jej pomocy bardzo wygodnie i w dużym stopniu niezależnie od systemu operacyjnego (Windows czy Linux czy inne).  Na czas pisania artykułu mamy wersję 1.70 niniejszej biblioteki.


Przed przejściem dalej należy odpowiedzieć sobie na pytanie czy na pewno potrzebuję ją budować od nowa całą, a może da się zrobić to prościej? Większość komponentów/podbibliotek to tylko nagłówki (ang. header-only), czyli aby jej użyć nie trzeba budować. Gdy Twoja biblioteka musi być zbudowana to jeśli jesteś użytkownikiem linuxów to wiesz jak zainstalować z repozytorium (co prawda bardzo rzadko jest najnowsza wersja). Jeśli z kolei użytkownikiem Windowsa masz dostępne na stronie pobierania „Prebuilt windows binaries” (oczywiście tylko dla wersji Visual Studio, dla innych kompilatorów musisz sobie zbudować).
Jeśli z jakiegoś powodu ww. warianty Ci nie wystarczają zapraszam dalej.


Przed instalacją należy bibliotekę pobrać (najlepiej ze strony projektu) i rozpakować. Potem należy przejrzeć instrukcję „zaczynamy” (ang. „Getting started”) na swoim systemie. Załóżmy, że główny katalog rozpakowanej biblioteki to $(BOOST).

Instalacja na Windowsie przy pomocy MinGw

Jest to nieszablonowy przypadek, dlatego go opiszę.

  1. Musimy mieć nasz kompilator na zmiennej środowiskowej PATH.
  2. Budujemy dla mingw (mingw to gcc dla Windows, dlatego toolset=gcc):
    1. $(BOOST)\tools\build\b2.exe toolset=gcc –prefix=”gdzieChcemyZbudowac\”  link=static install
      powyższa opcja skompiluje i zainstaluje nam całego boosta, jeśli nie chcemy całego:
    2. Możemy wyświetlić jakie są biblioteki:
      $(BOOST)\tools\build\b2.exe –show-libraries
      mając tę listę możemy zbudować wybrane komponenty np. tak:
      $(BOOST)\tools\build\b2.exe –with-program_options –with-system –with-filesystem toolset=gcc –prefix=”gdzieChcemyZbudowac\” link=static install
    3. Jak zbudujemy pojawi się nam gdzie jak użyć includów i gdzie są biblioteki skompilowane np.:
      The following directory should be added to compiler include paths:
      C:\Users\user\Desktop\boost_1_70_0
      The following directory should be added to linker library paths:
      C:\Users\user\Desktop\boost_1_70_0\stage\lib
    4. Gotowe!

Budowanie i instalacja na linuxie

Budowanie pod linuxem jest proste i w pełni opisane w instrukcji.

Aby zbudować boosta w pełni w domyślnej lokalizacji (do której należy mieć uprawnienia administratora) wystarczy najzwyczajniej w świecie zawołać komendy:

./bootstrap.sh
./b2 install

Jeśli chcemy jednak zainstalować bibliotę w innej lokalizacji musimy użyć

--prefix=lokalizacja/gdzie/chcemy/zainstalować

Jeśli też nie potrzebujemy budować wszystkich bibliotek (bo nie będziemy wszystkich używać) polecam użyć opcji:

--with-libraries=biblioteka1,biblioteka2

aby się dowiedzieć jakie mamy biblioteki można zawołać:

./bootstrap.sh --show-libraries

w moim przypadku dało to listę bibliotek (skróciłem wydruk wielolinijkowy):

atomic, chrono, container, context, contract, coroutine, date_time, exception, fiber, filesystem, graph, graph_parallel, headers, iostreams, locale, log, math, mpi, program_options, python, random, regex, serialization, stacktrace, system, test, thread, timer, type_erasure, wave

Wiedząc to wszystko możemy zbudować kilka bibliotek w interesującej nas lokalizacji:

./bootstrap.sh --with-libraries=stacktrace,program_options,container,system --prefix=/home/agh/Desktop/boost_zbudowany/

mając to możemy komendę budującą jw., ale ja wolę sobie zbudować biblioteki statycznie:

./b2 link=static install

w rezultacie pojawią się biblioteki we wskazanym katalogu. Teraz należy jeszcze kompilując nasz program podać ścieżki do nagłówków i skompilowanych bibliotek.


Program przy użyciu boost

Możemy sobie pobrać przykład z program_options albo otworzyć z

$(katalogZPobranymBoostem)/libs/program_options/example/first.cpp

Mając gotowy kod możemy zbudować, przykładowo:

g++ first.cpp -I/home/agh/Desktop/boost_zbudowany/include -L/home/agh/Desktop/boost_zbudowany -lboost_program_options -o program.exe

i wszystko działa!


Dorzucenie części boosta do projektu

Może się zdarzyć, że chcemy tylko jedną bibliotekę dorzucić do projektu, nie chcemy dorzucać zbt dużej ilości zależności (cały boost to ponad 100 Mb), dlatego można użyć:

./b2 tools/bcp # to nam zbuduje to narzędzie

Następnie możemy sobie go użyć:

${sciezkaDoBcb}/bcp boost/naglowek.hpp sciezka/gdzie/wrzucic/zaleznosci

Notatki: Stawianie własnej rozproszonej bazy danych blockchain na bazie Hyperledger Iroha

Niniejszy wpis nie jest jeszcze w formie reprezentatywnej, stanowi jedynie formę notatek dla napisania kiedyś profesjonalnego artykułu, czytasz na własną odpowiedzialność.

Hyperledger jest to projekt-parasol, skupiający otwarto-źródłowe narzędzia do obsługi blockchain utrzymywany przez Fundację Linuxa. Wśród projektów jest projekt Iroha, napisany w C++, którego dotyczą poniższe opisy.

Instalacja zależności do Iroha

Testowano dla czystego systemu Ubuntu 18.04. Wpierw musimy zainstalować zależności, dokładny ich opis znajduje się w dokumentacji, są to:

build-essential automake libtool libssl-dev zlib1g-dev libc6-dbg golang git tar gzip ca-certificates wget curl file unzip python cmake libboost postgresql

aby je zainstalować wystarczy komenda:

sudo apt-get -y –no-install-recommends install build-essential automake libtool libssl-dev zlib1g-dev libc6-dbg golang git tar gzip ca-certificates wget curl file unzip python cmake cmake-qt-gui postgresql-all

oczywiście po pobraniu irohy cmake wykryje jeszcze braki opcjonalnego oprogramowania, niewspomnianego w dokumentacji, jeśli chcemy je doinstalować to:

sudo apt-get -y python-pip python-dev libtbb-dev libgtest-dev libspdlog-dev libprotobuf-c-dev rapidjson-dev rapidjson-doc libsoci-dev libsoci-postgresql3.2 libgflags-dev
pip install ed25519

to nam jeszcze nie rozwiąże zależności, pewne rzeczy nie są dostępne w standardowych repozytoriach, lub nie działają (gtest), dlatego musimy jeszcze doinstalować:

(oczywiście nie musimy tego budować z testami czy benchmarkami)

Budowanie Hyperledger-Iroha

Pobieramy repozytorium:

git clone https://github.com/hyperledger/iroha.git

następnie przy pomocy cmake lub cmake-gui budujemy (nie potrzebujemy testów i benchmarków). Uwaga – nie przesadzajmy z ilością wątków, gdyż pewne pliki (m.in irohad/main/impl/on_demand_ordering_init.cpp, którego kompilacja zajmuję parę GB RAMu) są bardzi RAMożerne. Mi dla 2 wątków wystarczyło 5 GB pamięci.

Konfiguracja bazy danych

Oto zagadka ludzkości -po co w blockchainie baza danych. Pomińmy rozważania nad zamysłem autorów (i dodajmy, że nie chce mi się sprawdzać w kodzie do czego używana jest ta baza) przejdźmy do konfiguracji bazy na komputerze, na którym ma być postawiony węzeł bazy danych. Przykładowe komendy dla użytkownika user:

sudo -u postgres /usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l logfile start

#tworzenie roli do logowania dla aktualnego użytkownika:
sudo -u postgres /usr/lib/postgresql/10/bin/psql

postgres=# create role user;
postgres=# ALTER ROLE „user” WITH LOGIN;
postgres=# create database user owner user ;
postgres=# alter user user password ‚123456’;

Uruchamianie węzła blockchain bez dockera

W dokumentacji podają jak to zrobić przy użyciu dockera, ja jednak robiłem to bez dockera. Po pierwsze musimy sobie skonfigurować użytkownika i hasło do bazy, oraz miejsce przechowania łańcucha bloków, te ustawienia znajdują się w pliku: example/config.sample – warto sobie go skopiować i ustawić. Po tych ustawieniach możemy sobie już uruchomić węzeł bazując na przykładowych danych:
$(IROHA_BUILD_PATH)/bin/irohad –config example/config.sample –genesis_block example/genesis.block –keypair_name example/node0

Wysyłanie komend przez wbudowanego klienta

W drugiej konsoli (lub na innym komputerze) możemy teraz skorzystać z gotowego klienta do serwera blockchain (pliki i ścieżki do katalogu example):

$(IROHA_BUILD_PATH)/bin/iroha-cli –account-name admin@test –key_path example/

Mamy teraz dostęp przez command-line-interface, możemy sprawdzić czy wszystko działa np. wykonując kroki, co ten człowiek: https://www.srcmake.com/home/iroha-tutorial