Ziel soll es später sein, ein boost/asio Programm auf dem BBB kompilieren und ausführen zu können.
Voraussetzungen:
* Grundlegendes Verständnis der Programmiersprache C++
* Windows 10 PC
* BeagleBone Black (oder ähnliches)
* Erfahrung der Bedienung von ssh
* Windows Host und BBB im gleichen Netzwerk und Möglichkeit BBB über ssh zu erreichen
1) Vorbereiten der Buildumgebung
Zum builden der Bibliotheken benötigen wir in diesem Beispiel einen Windows 10 Rechner. Hierauf wird das WSL mit Ubuntu oder einer anderen Linuxdistro eurer Wahl installiert. Wie das gemacht wird findet ihr hier [link einfügen]
2) Herunterladen von Boost
Nach Start der WSL befindet sich die Shell in der Regel nicht im Home-Verzeichnis, dieses erreicht man dur den Befehl cd ~. Mittels wget https://dl.bintray.com/boostorg/release/1.69.0/source/boost_1_69_0.tar.gz lässt sich der tar-ball von boost 1.69.0 herunterladen. Mit tar -xzf boost_1_69_0.tar.gz lässt sich nun Boost entpacken.
3) Herunterladen und installieren der ARM g++ Toolchain
Mit Hilfe von apt, lässt sich in der WSL schnell die cross-compile Toolchain für g++ installieren.
apt install binutils-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
3.1) Crosscompilen eines einfachen Programms
Um zu überprüfen ob der Crosscompiler korrekt funktioniert, kompilieren wir zunächst ein einfaches Programm. Dazu öffnen wir einen Editor und speichern folgende Zeilen als helloBBB.cpp ab:
#include <iostream>
int main(){
std::cout << "Hello BBB" << std::endl;
}
Mit dem Befehl:
arm-linux-gnueabihf-g++ test.cpp -o test
erstellen wir die Executable "test". Versuchen wir diese auf unserem Host-Rechner mit ./test auszuführen sollte folgende Fehlermeldung werfen:
-bash: ./test: cannot execute binary file: Exec format error
Dies liegt selbstverständlich daran, dass unsere Datei für eine andere Systemarchitektur kompiliert wurde. Mit Hilfe von scp kopieren wir die Datei auf unseren BBB, in meinem Fall wie folgt:
scp test user@134.122.141.040:~/test
Via ssh loggen wir uns nun in den BBB ein und finden die Datei "test" auch in unserem Home-Verzeichnis. Hier können wir nun unsere Exec ausführen.
4) Bootstrapping
Das Bootstrapping erstellt eine bjam/b2 Konfiguration für boost. Hierbei handelt es sich um das boost eigene Buildsystem. Für das kompilieren für ARM kann man zusätzlich folgende Optionen übergeben:
./bootstrap.sh --without-libraries=python--without-libraries=context--without-libraries=fiber--without-libraries=coroutine--without-icu
5) Anpassen des Build-Projektes
Das bootstrapping-Skript hat nun im boost-Verzeichnis zusätzlich die project-config.jam erstellt. Diese muss noch mittels Texteditor eigener Wahl angepasst werden. In meinem Fall vim:
vim project-config.jam
etwa in Zeile 12 sollte using gcc; stehen. Dieses Statement spezifiziert, welche Toolchain genau verwendet werden soll. Im Falle der cross-compilation muss hier die entsprechende Toolchain eingetragen werden. In meinem Fall:
using gcc : arm : arm-linux-gnueabihf-g++ ;
Speichern und Beenden.
6) Das eigentliche kompilieren
Der Kompilationsprozess wird mittels ./b2 gestartet. Dabei ist darauf zu achten, dass viele ARM Prozessoren nicht über alle in boost enthaltenen Operationen verfügen. Daher werden einige Libs nicht mitkompiliert. Wird dies beim starten von b2 als Parameter übergeben, stellt es aber kein Problem dar. Hier mein Kompilationsaufruf:
./b2 --prefix=~/boostForBBB/ \
--without-context \
--without-coroutine \
--without-fiber \
--without-python \
--address-model=32 \
--stagedir=~/boostForBBBstage-arm-gnueabihf-g++/ \
-j3 \
-toolset=arm-linux-gnueabihf-g++ \
-threading=multi \
An Stelle j3 sollte die Anzahl an Kernen stehen mit denen kompiliert werden soll.Je nach Rechenleistung der Maschine, kann der Buildprozess einige Zeit in Anspruch nehmen. Gerade 1.69.0 wirft während der Kompilation einige deprecated Warnungen. Diese stellen aber kein weiteres Problem dar, lediglich wurde auto_ptr im C++ Standard mit neueren Smart-Pointern ersetzt https://stackoverflow.com/questions/2404115/is-auto-ptr-deprecated
7) Crosscompilen eines Programmes mit boost für BBB
Boost allein belegt etwa 1GB an Speicherplatz. Damit ist Boost denkbar ungeeignet um komplett auf einen BBB, einen Raspi oder ähnliches kopiert zu werden. Auch benötigte der Zielrechner auf Grund seiner Rechenleistung wesentlich mehr Zeit um ein Programm zu kompilieren als unsere Windows-Workstation. Daher ergibt es Sinn, alle Programme auf dem Windowsrechner zu schreiben und zu kompilieren und im Anschluss auf den Zielrechner zu kopieren (wie bereits in 3.1 gezeigt).
Um unsere Boost-Bibliotheken zu testen öffnen wir eine neue Textdatei namens "timer.cpp". Wir fügen folgenden Code ein:
#include <iostream>
#include <boost/asio.hpp>
int main(){
boost::asio::io_context io;
boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
t.wait();
std::cout << "Hello Timer" << std::endl;
}
Beenden und abspeichern. Der Aufruf des Compilers benötigt nun noch ein paar Zusatzinformationen über die Thread-Architektur und den Ort an dem sich unsere crosskompilierten Boost-Libs befinden. Ein Aufruf könnte in etwa wie folgt aussehen:
arm-linux-gnueabihf-g++ timer.cpp \
-I ~/crossBoost/boost_1_69_0/ \
-L ~/crossBoost/boost_1_69_0/boostForBBBstage-arm-gnueabihf-g++/lib/
-lpthread
Ist die Kompilation erfolgreich, kann auch der Output dieses Prozesses auf den BBB kopiert und getestet werden (siehe 3.1)