Cómo construir impulso para android como biblioteca compartida con c + + 11 de apoyo

Estoy tratando de construir boost_1.60.0 (como biblioteca compartida) para android con c + + 11 de apoyo. Estoy usando la última ndk (actualmente android-ndk-r10e). El host de generación es Windows-10.

Esto es para un proyecto no-opensource. Por lo que entiendo que no puedo usar gnustl_shared, y tengo que usar c ++ _ shared como el android c + + runtime.

Mi proyecto-config.jam se parece a esto:

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 ; 

El comando build es:

 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 

Con el fin de determinar los parámetros en el proyecto-config.jam he construido una muestra de biblioteca compartida utilizando el ndk-build, obtener sus mensajes de depuración, y extrajo los comandos de compilación y enlace que utiliza.

compilar:

 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.od -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,...) 

enlazar:

 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,...) 

Por brevedad sólo he construido el sistema de archivos para esta prueba, pero al final planeo construir al menos hilo, sistema de archivos, date_time, asio y bibliotecas de registro.
Finalmente el error que consigo es como sigue.

 ...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... 

El error dice que necesita el directorio para encontrar las bibliotecas necesarias, pero el problema es que bajo android ndk hay varios archivos con nombres rt y crtbegin_so.o y tal. Supongo que necesito hacer que el compilador determine el directorio correcto.

Con todo dicho lo que necesito en realidad es construir impulsar bibliotecas compartidas para android con c + + 11 de apoyo. Así que puedo aceptar su ayuda, ya sea señalándome en la dirección correcta utilizando los parámetros de construcción anteriores o proporcionándome una muestra de trabajo para que pueda resolver los detalles yo mismo.

Oh también una cosa más: si utilizo link=static lugar de link=shared en el comando build la construcción tiene éxito. Pero no he probado las librerías estáticas producidas.

Una información relevante está aquí ( Boost para Android ), donde han sido capaces de construir con éxito las bibliotecas compartidas, pero parece que los archivos resultantes tienen un sufijo de versión que android no puede manejar. También uno no puede renombrar simplemente el binario porque el nombre de archivo es hardcoded en él. Una salida, según la última entrada, es establecer la variable version_type a none (version_type = none) en la sección linux del archivo. En su caso, la configuración de la compilación podría ser un poco diferente, pero puede valer la pena echar un vistazo a los cambios que hicieron en esa discusión.

Building Boost en Linux usando el NDK

Sé que usted está preguntando sobre Windows, pero yo quería hacer esto en macOS y falló con casi el error exacto. Finalmente me rompí y lo hizo en mi servidor linode que funcionó sin ningún problema. Esto me dice que en realidad no están haciendo un buen trabajo de probar otras plataformas. Compilar estática sólo en macOS funciona como también lo descubrió en Windows.

Punto de referencia

  • NDK R13
  • Boost 1.62.0
  • Probado con clang ++; G ++ también funciona

Si se está preguntando por qué utilizo clang, las Notas de la versión tienen el siguiente mensaje:

GCC ya no es compatible. No se eliminará de la NDK todavía, pero ya no está recibiendo backports. No se puede quitar hasta que libc ++ se ha estabilizado lo suficiente como para ser el valor predeterminado, ya que algunas partes de gnustl son aún incompatibles con Clang. Es probable que se retire después de ese punto.

User-config.jam

Coloqué este archivo en mi directorio personal. Yuck.

 androidNDKRoot = /path/to/ndk-R13-standalone ; using clang : android : $(androidNDKRoot)/bin/arm-linux-androideabi-clang++ : ; 

Modificación de libtool.m4 en boost para evitar el control de versiones de las bibliotecas

libtool.m4 en tools/build/src/engine/boehm_gc/libtool.m4 en la fuente boost no tiene referencia a android y necesitará cambiar version_type=linux en la sección linux*) a version_type=none . Esto hará que aparezcan enlaces simbólicos sin el número de versión agregado al final vinculado a las bibliotecas compartidas versionadas en la salida.

edificio

El sistema operativo de destino DEBE ser Android para evitar que se -lrt bandera -lrt , lo que causará el fallo del enlace compartido.

 ./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 

Aquí: http://silverglint.com/boost-for-android/ puede encontrar una forma sencilla e indolora de construir una versión moderna (eg 1.64.0) de boost para android.

También se incluye una aplicación de ejemplo que muestra cómo usar los binarios de optimización así construidos.

  • ¿Cómo usar std :: stoul y std :: stoull en Android?
  • Android NDK r9b y compilación de C ++ 11
  • Compilación de C + + 11 fuentes para Android NDK
  • C ++ 11 std :: async en Android NDK no funciona
  • ¿Cuál es la diferencia en GCC entre -std = gnu ++ 0x y -std = c ++ 0x y cuál debe ser utilizado?
  • ¿Cómo habilitar C ++ 11 para Android Studio?
  • Uso no válido de tipo incompleto en android ndk utilizando c ++ 11 std :: async
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.