web-dev-qa-db-de.com

Kompilieren und verwenden Sie Boost für Android NDK R10e

Wie kompiliere und verwende ich Boost für den Android NDK? Ich habe alles versucht, was ich online gefunden habe, von Boost für Android , um es selbst mit der bjam-Datei zu kompilieren. Es gelingt mir jedoch nicht. Wenn ich versuche, es mit bjam zu kompilieren, erhalte ich folgende Fehlermeldung:

error: toolset gcc initialization:

error: version 'androidR10e' requested but 'g++-androidR10e' not found and version '4.2.1' of default 'g++' does not match
error: initialized from /path/to/Android-ndk-r10e/sources/boost/tools/build/v2/user-config.jam:86

Hat jemand Boost erfolgreich mit Android NDK R10e verwendet?

Und wenn ich es kompilieren kann, wie soll ich es in meinem Android-App-Projekt verwenden?

17
BSod

Es ist uns gelungen, es für NDKr10d zu kompilieren. Für NDKr10e ..__ sollte es dasselbe sein. Die project-config.bjam sollte auf den gcc-Compiler aus dem NDK zeigen. Unsere sieht so aus:

import option ; 
using gcc : arm : D:\\Android\\ndk\\toolchains\\arm-linux-androideabi-4.9\\prebuilt\\windows-x86_64\\bin\\arm-linux-androideabi-g++.exe ; 
option.set keep-going : false ; 

Dann kompilieren Sie einfach mit b2 und erklären Pfade zu Android:

b2 --reconfigure <your options>
    toolset=gcc-arm
    include=<ndk folder>\sources\cxx-stl\gnu-libstdc++\4.9\include
    include=<ndk folder>\sources\cxx-stl\gnu-libstdc++\4.9\libs\<target platform>\include
    include=<ndk folder>\platforms\<Android api version>\Arch-arm\usr\include
    install --libdir=stage\lib\<target platform>

Wir ziehen gleich nach ndkr10e. Könnten Sie sagen, ob Boost damit noch funktioniert? :)

6
brainsandwich

Der einfachste Weg wäre die Verwendung von CrystaX NDK , die bereits erstellte und einsatzbereite Boost-Bibliotheken enthält. Und hier sind Beispiele für die Verwendung von Boost mit CrystaX NDK: 1 , 2

2

Nach den Boost-Richtungen konnte ich mit NDKr10e auf Ubuntu 12.04 einen Boost-Wert von 1,60 aufbauen (obwohl ich vermute, dass dies sehr wenig vom Host-System abhängt). Hier sind meine Notizen:

holen und Entpacken Sie Boost-Quell-Tarball (ich verwendete 1.60): boost_1_60_0.tar.bz2

[email protected]:/scratch/moskewcz/Android/src$ ll
total 74M
drwx------ 10 moskewcz moskewcz 4.0K Mar  9 14:14 boost_1_60_0
-rw-rw-r--  1 moskewcz moskewcz  74M Jan  5 11:15 boost_1_60_0.tar.bz2

befolgen Sie die Anweisungen zum Boosten, um mit dem Unix-Abschnitt "Benutzerdefinierte Binärdateien erstellen" zu beginnen

verwenden Sie ein neues, leeres Stammverzeichnis, um b2 zu installieren, d. h./scratch/boost-build-root. Verwenden Sie usr als Präfix. erneut die Boost-Anweisungen befolgen:

[email protected]:/scratch/moskewcz/Android/src/boost_1_60_0/tools/build$ ./bootstrap.sh
[email protected]:/scratch/moskewcz/Android/src/boost_1_60_0/tools/build$ ./b2 install --prefix=/scratch/moskewcz/Android/boost-build-root/usr

b2 in path setzen (wieder wie in der Anleitung beschrieben)

export PATH=/scratch/moskewcz/Android/boost-build-root/usr/bin:$PATH

in einer Jam-Datei (ich hatte keine ~/user-config.jam, also habe ich eine erstellt und verwendet, vielleicht gibt es eine bessere Auswahl an Jam-Dateien zum Erstellen/Bearbeiten). Fügen Sie etwas Jam-Code (?) hinzu, um eine Gcc-Version (Toolset) zu definieren ) zeigt auf ein g ++ aus einer eigenständigen Toolchain. Beachten Sie, dass dies eine Toolchain ist, die mit dem NDK auf normale Weise erstellt wurde, nachdem Sie die Anweisungen zum Erstellen einer eigenständigen Toolchain erstellt haben. Ich zeige NICHT auf ein g ++ innerhalb des NDK selbst (das kann funktionieren oder nicht, ich weiß nicht):

import option ; 
using gcc : arm_linux_Android_4.9 : /scratch/Android-stc/bin/aarch64-linux-Android-g++ ; 
option.set keep-going : false ;

gehen Sie zum Boosten von Projektwurzeln und zum Bauen, meist gemäß den Anweisungen. --build-dir kann optional sein? fügte auch -j8 hinzu, um zu tun || bauen

[email protected]:/scratch/moskewcz/Android/src/boost_1_60_0$ b2 -j8 --build-dir=bin.v2 toolset=gcc-arm_linux_Android_4.9 stage

beachten Sie, dass dies versucht, sowohl statische als auch gemeinsam genutzte Bibliotheken standardmäßig zu erstellen. Das Erstellen gemeinsam genutzter Bibliotheken schlägt jedoch fehl, weil Android nicht librt.so hat. Nach meinen Recherchen behaupten die Leute, dass unter Android (einige?) die Funktionalität von librt.so ist in libc.so - es kann also in Ordnung sein, -lrt einfach aus den Verknüpfungsschritten zu entfernen, um gemeinsam genutzte Libs für Android zu erstellen. Ich habe das nicht versucht. sehen:

https://code.google.com/p/Android/issues/detail?id=5730

Building Boost für Android mit Fehler "-lrt kann nicht gefunden werden"

1

Ich konnte nur mit 10d bauen. Das Cross Compilieren von Linux-> Android mit Boost für Android hat sofort funktioniert.

Um eine etwas veraltete ndk herunterzuladen, da nicht alle ndk sofort von Boost für Android unterstützt werden , können Sie dieses Handbuch verwenden: Wo finde ich alte Versionen von Android NDK?

Hinweis: Ich wollte auch die Toolchain angeben. Ich musste es an zwei Orten machen:

  1. In build-Android.sh direkt nach der oben erwähnten Zeile:

    TOOLCHAIN ​​= $ {TOOLCHAIN: -arm-linux-androideabi-4.9}

  2. In der Kommandozeile

    bash build-Android.sh [ndk location] --toolchain = arm-linux-androideabi-4.9

Tatsächlich funktionierte es besser, wenn ich genau spezifizierte, welche Verstärkungskomponenten ich mit --with-libraries=[comma separated list] wollte.

Wenn ich stattdessen alles bauen würde, würde ich bekommen:

... Fehler beim Aktualisieren von 38 Zielen ...

... übersprungen 6 Ziele ...

... 10568 Ziele aktualisiert ...

FEHLER: Fehler beim Aufbau von Boost für Android!

Erledigt!

0
Antonio

Hier: http://silverglint.com/boost-for-Android/ finden Sie einen einfachen und schmerzlosen neuen Weg, um eine moderne (zB 1.64.0) -Version von boost für Android ..__ zu bauen. Funktioniert mit clang und gcc.

Ebenfalls enthalten ist eine Beispiel-App, die Ihnen zeigt, wie Sie die so erstellten Boost-Binärdateien verwenden.

0
Declan