web-dev-qa-db-fra.com

Compiler et utiliser boost pour Android NDK R10e

Comment compiler et utiliser Boost pour le NDK Android? J'ai essayé tout ce que j'ai trouvé en ligne, depuis Boost pour Android pour le compiler moi-même avec le fichier bjam. Cependant, je ne réussis pas. Quand j'essaye de le compiler avec bjam, j'obtiens l'erreur suivante:

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

Quelqu'un at-il utilisé avec succès Boost avec Android NDK R10e?

Et quand je peux le compiler, comment dois-je l'utiliser pour l'utiliser dans mon projet d'application Android?

17
BSod

Nous avons réussi à le compiler pour NDKr10d. Ce devrait être la même chose pour NDKr10e . Le fichier project-config.bjam devrait pointer vers le compilateur gcc à partir du NDK. Le nôtre ressemble à ceci:

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 ; 

Ensuite, il suffit de compiler avec b2 pour indiquer les chemins à 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>

Nous sommes sur le point de passer à ndkr10e. Pourriez-vous dire si boost fonctionne toujours avec elle? :)

6
brainsandwich

Le moyen le plus simple serait d’utiliser CrystaX NDK , qui contient les bibliothèques Boost déjà construites et prêtes à l’emploi. Et voici des exemples d'utilisation de Boost avec CrystaX NDK: 1 , 2

2

En suivant les instructions de démarrage, j’ai pu construire le boost 1.60 avec NDKr10e sur Ubuntu 12.04 (bien que je suppose que très peu de choses dépendent du système hôte). Voici mes notes:

récupère et décompresse l'arbalète source boost (j'ai utilisé 1.60): boost_1_60_0.tar.bz2

moskewcz@maaya:/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

suivez les instructions de démarrage dans la section "Créer des fichiers binaires personnalisés" unix

utilisez une nouvelle racine vide pour installer b2, à savoir/scratch/boost-build-root; utilisez usr comme préfixe; encore une fois en suivant les instructions de boost:

moskewcz@maaya:/scratch/moskewcz/Android/src/boost_1_60_0/tools/build$ ./bootstrap.sh
moskewcz@maaya:/scratch/moskewcz/Android/src/boost_1_60_0/tools/build$ ./b2 install --prefix=/scratch/moskewcz/Android/boost-build-root/usr

mettre b2 dans le chemin (encore une fois selon les instructions)

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

dans certains jamfile (je n'avais pas de ~/user-config.jam, alors j'en ai créé un et je l'ai utilisé, peut-être qu'il y a un meilleur choix de jamfile pour créer/éditer) ajouter du jam-code (?) pour définir une version gcc ) pointant vers un g ++ depuis une chaîne d’outils autonome. notez qu'il s'agit d'une chaîne d'outils créée avec le NDK de la manière habituelle en suivant les instructions «créer une chaîne d'outils autonome». Je ne pointe pas vers un g ++ à l'intérieur du NDK lui-même (cela peut ou ne peut pas fonctionner, je ne sais pas):

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

aller à la racine du projet et de construire, principalement selon les instructions. --build-dir peut être optionnel? a également ajouté -j8 à faire || construire

moskewcz@maaya:/scratch/moskewcz/Android/src/boost_1_60_0$ b2 -j8 --build-dir=bin.v2 toolset=gcc-arm_linux_Android_4.9 stage

notez que ceci essaye de construire à la fois des bibliothèques statiques et partagées par défaut, mais la construction de bibliothèques partagées échoue car Android ne dispose pas de librt.so - selon mes recherches, des gens prétendent que sous Android (certains?) les fonctionnalités de librt.so se trouve à l'intérieur de libc.so - vous pouvez donc supprimer simplement -lrt des étapes de création de liens afin de créer des bibliothèques partagées pour Android. je n'ai pas essayé cela. voir:

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

Building Boost for Android avec l'erreur "ne trouve pas -lrt"

1
Matthew Moskewicz

J'ai seulement réussi à construire avec 10d. Cross compilation de Linux-> Android en utilisant Boost pour Android a tout de suite travaillé avec ça.

Pour télécharger un ndk légèrement obsolète, car tous ne sont pas immédiatement pris en charge par Boost pour Android , vous pouvez utiliser ce guide: Où puis-je trouver les anciennes versions de Android NDK?

Remarque: je voulais aussi spécifier la chaîne d'outils. Je devais le faire à 2 endroits:

  1. Dans build-Android.sh, juste après la ligne mentionnée ci-dessus:

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

  2. En ligne de commande

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

En fait, cela fonctionnait mieux lorsque je spécifiais exactement quels composants de boost je voulais avec --with-libraries=[comma separated list].

Si au contraire je construisais tout, j'obtiendrais:

... échec de la mise à jour de 38 cibles ...

... Sauté 6 cibles ...

... mis à jour 10568 cibles ...

ERREUR: Echec de la création de boost pour Android!

Terminé!

0
Antonio

Ici: http://silverglint.com/boost-for-Android/ vous pouvez trouver un nouveau moyen simple et indolore de construire une version moderne (par exemple 1.64.0) de boost pour Android . Clang et Gcc.

Est également inclus un exemple d'application qui vous montre comment utiliser les fichiers binaires boost ainsi créés.

0
Declan