web-dev-qa-db-fra.com

Comment créer boost pour Android en tant que bibliothèque partagée avec prise en charge de c ++ 11

J'essaie de créer boost_1.60.0 (en tant que bibliothèque partagée) pour Android avec prise en charge de c ++ 11. J'utilise le dernier ndk (actuellement Android-ndk-r10e). L'hôte de construction est Windows-10. 

Ceci est pour un projet non-opensource. Donc, autant que je sache, je ne peux pas utiliser gnustl_shared, et je dois utiliser c ++ _ shared comme runtime Android c ++.

mon projet-config.jam ressemble à ceci:

androidNDKRoot = c:/Android-ndk-r10e ;
 using gcc : Android :
     $(androidNDKRoot)/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ :
      <root>$(androidNDKRoot)/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/
      <compileflags>-MMD
      <compileflags>-MP
      <compileflags>-MF
      <compileflags>-fpic 
      <compileflags>-ffunction-sections 
      <compileflags>-funwind-tables 
      <compileflags>-fstack-protector 
      <compileflags>-no-canonical-prefixes 
      <compileflags>-march=armv5te 
      <compileflags>-mtune=xscale 
      <compileflags>-msoft-float 
      <compileflags>-fno-rtti 
      <compileflags>-mthumb 
      <compileflags>-Os 
      <compileflags>-g 
      <compileflags>-DNDEBUG 
      <compileflags>-fomit-frame-pointer 
      <compileflags>-fno-strict-aliasing 
      <compileflags>-finline-limit=64
      <compileflags>-IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/libcxx/include
      <compileflags>-IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/../llvm-libc++abi/libcxxabi/include
      <compileflags>-IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/../../Android/support/include
      <compileflags>-IC:/Android-ndk-r10e/platforms/Android-9/Arch-arm/usr/include
      <compileflags>-Wa,--noexecstack 
      <compileflags>-Wformat 
      <compileflags>-Werror=format-security
      <compileflags>-DUNIX 
      <compileflags>-DANDROID 
      <compileflags>-Wl,--no-undefined
      <cxxflags>-fexceptions 
      <linkflags>-lc++_shared
      <archiver>$(androidNDKRoot)/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-ar
      <ranlib>$(androidNDKRoot)/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-ranlib
        ;        

la commande de construction est:

b2 --toolset=gcc-Android cxxflags="-std=c++11 " --prefix=..\boost_Android_arm --builddir=./boost_Android_arm/builddir target-os=linux --with-filesystem define=BOOST_FILESYSTEM_VERSION=3 link=shared runtime-link=shared threading=multi 

Afin de déterminer les paramètres dans le fichier project-config.jam, j'ai créé un exemple de bibliothèque partagée à l'aide de ndk-build, récupéré ses messages de débogage et extrait les commandes de compilation et de liaison qu'il utilise.

compiler: 

C:\Android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-g++.exe,C:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi/objs/someLib/./Unity1.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Ijni/../../library/../../../../ -Ijni/../../library/../../../../src/ -IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/libcxx/include -IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/../llvm-libc++abi/libcxxabi/include -IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/../../Android/support/include -Ijni/../../library -DANDROID -DHAVE_CONFIG_H -DSESTEK_Android_XERCES_HACK -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -fno-strict-aliasing -frtti -fexceptions -DUNIX -DANDROID -IC:/Android-ndk-r10e/platforms/Android-9/Arch-arm/usr/include -c jni/../../library/./Unity1.cpp -o ./obj/local/armeabi/objs/someLib/./Unity1.o,...)

lien: 

C:\Android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-g++.exe,C:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libsomeLib.so -shared --sysroot=C:/Android-ndk-r10e/platforms/Android-9/Arch-arm ./obj/local/armeabi/objs/someLib/./Unity1.o -lgcc ./obj/local/armeabi/libc++_shared.so -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -mthumb -lc -lm -o ./obj/local/armeabi/libsomeLib.so,...)

Par souci de brièveté, je n’ai construit que le système de fichiers pour cet essai, mais au final, j’ai l’intention de créer au moins des bibliothèques de threads, de systèmes de fichiers, de date_time, d’asio et de journaux.
Enfin, l’erreur que j’obtiens est la suivante. 

...patience...
...found 660 targets...
...updating 13 targets...
gcc.compile.c++ bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\error_code.o
gcc.link.dll bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\libboost_system-gcc-mt-1_60.so.1.60.0
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot open crtbegin_so.o: No such file or directory
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lrt
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot open crtend_so.o: No such file or directory
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lc++_shared
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lstdc++
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lm
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lc
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -ldl
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lc
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\error_code.o: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\error_code.o: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\error_code.o: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC
    ./boost/system/detail/error_code.ipp:458: error: undefined reference to '__dso_handle'
    ./boost/system/detail/error_code.ipp:464: error: undefined reference to '__dso_handle'
    ./boost/system/detail/error_code.ipp:158: error: undefined reference to '__dso_handle'
collect2.exe: error: ld returned 1 exit status
    "c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++"    -o "bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\libboost_system-gcc-mt-1_60.so.1.60.0"  -shared -Wl,--start-group "bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\error_code.o"  -Wl,-Bstatic  -Wl,-Bdynamic -lrt -Wl,--end-group -lc++_shared -pthread
...failed gcc.link.dll bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\libboost_system-gcc-mt-1_60.so.1.60.0...
...skipped <pstage\lib>libboost_system-gcc-mt-1_60.so.1.60.0 for lack of <pbin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi>libboost_system-gcc-mt-1_60.so.1.60.0...
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\codecvt_error_category.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\operations.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\path.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\path_traits.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\portability.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\unique_path.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\utf8_codecvt_facet.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\windows_file_codecvt.o
...skipped <pbin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi>libboost_filesystem-gcc-mt-1_60.so.1.60.0 for lack of <pbin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi>libboost_system-gcc-mt-1_60.so.1.60.0...
...skipped <pstage\lib>libboost_filesystem-gcc-mt-1_60.so.1.60.0 for lack of <pbin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi>libboost_filesystem-gcc-mt-1_60.so.1.60.0...
...failed updating 1 target...
...skipped 3 targets...
...updated 9 targets...

L'erreur indique qu'il a besoin du répertoire pour trouver les bibliothèques nécessaires, mais le problème est que sous Android ndk, il existe plusieurs fichiers portant les noms rt et crtbegin_so.o et autres. Je suppose que je dois faire en sorte que le compilateur détermine le bon répertoire lui-même.

Tout ceci étant dit, ce dont j'ai vraiment besoin, c'est de créer des bibliothèques partagées boost pour Android avec le support de c ++ 11. Je peux donc accepter votre aide en me dirigeant dans la bonne direction en utilisant les paramètres de construction ci-dessus ou en me fournissant un échantillon de travail afin que je puisse régler moi-même les détails.

Oh, encore une chose: si j'utilise link=static au lieu de link=shared dans la commande de construction, la construction réussit. Mais je n'ai pas essayé les bibliothèques statiques produites.

15
Mert

Construire Boost sur Linux avec le NDK

Je sais que vous parlez de Windows, mais je voulais le faire sur macOS et cela a échoué avec à peu près l'erreur exacte. Je suis finalement tombé en panne et l'ai fait sur mon serveur linode cela a fonctionné sans problème. Cela me dit qu'ils ne testent pas vraiment les autres plateformes. La compilation statique uniquement sur macOS fonctionne comme vous l'avez également découvert sous Windows.

Point de référence

  • NDK R13
  • Boost 1.62.0
  • Testé avec clang ++; g ++ fonctionne aussi

Si vous vous demandez pourquoi j'utilise Clang, les notes de publication contiennent le message suivant:

GCC n'est plus pris en charge. Il ne sera pas encore supprimé du NDK, mais il ne reçoit plus de backport. Il ne peut pas être supprimé avant Après que libc ++ soit devenu suffisamment stable pour être la valeur par défaut, car certaines parties De gnustl sont toujours incompatibles avec Clang. Il sera probablement supprimé Après ce point.

user-config.jam

J'ai placé ce fichier dans mon répertoire personnel. Beurk.

androidNDKRoot = /path/to/ndk-R13-standalone ;

using clang : Android
:
$(androidNDKRoot)/bin/arm-linux-androideabi-clang++
:
;

Modification de libtool.m4 dans Boost pour éviter le contrôle de version des bibliothèques

libtool.m4 sous tools/build/src/engine/boehm_gc/libtool.m4 dans la source boost n'a aucune référence à Android et vous devrez changer version_type=linux dans la section linux*) en version_type=none. Cela fera apparaître des liens symboliques sans que le numéro de version ne soit ajouté à la fin associée aux bibliothèques partagées versionnées dans la sortie.

Bâtiment

Le système d'exploitation cible DOIT être Android pour éviter que l'indicateur -lrt ne soit transmis, ce qui entraînerait l'échec de la liaison partagée.

./b2 \
   -d+2 \
   -j 4 \
   --reconfigure \
   target-os=Android \
   toolset=clang-Android \
   include=${Android_NDK_STANDALONE}/include/c++/4.9.x \
   link=static,shared \
   variant=debug,release \
   threading=multi \
   --layout=versioned \
   --prefix=${BOOST_INSTALL_DIR} \
   install
7

Une information pertinente est ici ( Boost pour Android ), où ils ont réussi à construire les bibliothèques partagées, mais il semble que les fichiers résultants ont un suffixe de version qu'Android ne peut pas gérer. De plus, il est impossible de renommer le fichier binaire, car le nom du fichier y est codé en dur. Comme dans le dernier post, une solution consiste à définir la variable version_type sur none (version_type = none) dans la section linux du fichier. Dans votre cas, la configuration de la construction peut être un peu différente, mais il peut être intéressant de jeter un coup d'œil sur les modifications apportées lors de cette discussion.

3
Joy Patra

Ici: http://silverglint.com/boost-for-Android/ Vous pouvez trouver un nouveau moyen simple et sans douleur de construire une version moderne (par exemple, 1.67.0) de boost pour Android.

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

Sinon, vous pouvez simplement télécharger des binaires prédéfinis

0
Declan