it-roy-ru.com

Как создать boost для Android как разделяемую библиотеку с поддержкой c ++ 11

Я пытаюсь собрать boost_1.60.0 (в качестве разделяемой библиотеки) для Android с поддержкой c ++ 11. Я использую последнюю версию ndk (в настоящее время Android-ndk-r10e). Хост сборки - Windows-10. 

Это для не открытого проекта. Итак, насколько я понимаю, я не могу использовать gnustl_shared, и мне нужно использовать c ++ _ shared в качестве среды выполнения Android c ++.

мой проект config.jam выглядит так:

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
        ;        

команда построения:

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 

Чтобы определить параметры в project-config.jam, я собрал пример разделяемой библиотеки с помощью ndk-build, получил ее отладочные сообщения и извлек команды, которые он использует для компиляции и компоновки.

компиляции: 

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

ссылка на сайт: 

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

Для краткости я собираю только файловую систему для этого испытания, но в конце я планирую собрать как минимум библиотеки потоков, файловой системы, date_time, asio и log.
Наконец, я получаю следующую ошибку. 

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

Ошибка говорит о том, что ей нужен каталог, чтобы найти необходимые библиотеки, но проблема в том, что под Android ndk есть несколько файлов с именами rt и crtbegin_so.o и такими. Я думаю, мне нужно, чтобы компилятор сам определил правильный каталог.

С учетом всего сказанного, на самом деле мне нужно собрать общие библиотеки для Android с поддержкой c ++ 11. Поэтому я могу принять вашу помощь, либо указав мне правильное направление, используя вышеуказанные параметры сборки, либо предоставив мне рабочий образец, чтобы я мог сам разобраться в деталях.

О, еще одна вещь: если я использую link=static вместо link=shared в команде сборки, сборка завершится успешно. Но я не пробовал выпускаемые статические библиотеки.

15
Mert

Сборка Boost на Linux с использованием NDK

Я знаю, что вы спрашиваете о Windows, но я хотел сделать это на MacOS, и он потерпел неудачу с почти точной ошибкой. Я наконец сломался и сделал это на моем сервере линода это работало без проблем. Это говорит мне о том, что они не очень хорошо тестируют другие платформы. Компиляция статики только в macOS работает так же, как вы обнаружили в Windows.

Точка отсчета

  • NDK R13
  • Boost 1.62.0
  • Протестировано с Clang ++; G ++ также работает

Если вам интересно, почему я использую clang, в примечаниях к выпуску есть следующее сообщение:

GCC больше не поддерживается. Он не будет удален из NDK просто пока, но больше не получает бэкпорт. Его нельзя удалить до после того, как libc ++ стал достаточно стабильным, чтобы быть по умолчанию, как некоторые части gnustl по-прежнему несовместимы с Clang. Скорее всего, он будет удален после этого момента.

пользователя config.jam

Я поместил этот файл в свой домашний каталог. Тьфу.

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

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

Модификация libtool.m4 в boost, чтобы избежать контроля версий библиотек

libtool.m4 в tools/build/src/engine/boehm_gc/libtool.m4 в источнике буста не имеет ссылки на Android, и вам нужно изменить version_type=linux в разделе linux*) на version_type=none. Это приведет к появлению символических ссылок без номера версии, добавленного в конец, связанный с версионными общими библиотеками в выходных данных.

Строительство

Целевой ОС ДОЛЖНА быть Android, чтобы избежать передачи флага -lrt, что приведет к сбою общего соединения.

./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
Cameron Lowell Palmer

Соответствующая информация находится здесь ( Boost для Android ), где они смогли успешно создать общие библиотеки, но, похоже, что в результате файлы имеют суффикс версии, который Android не может обработать. Также нельзя просто переименовать двоичный файл, потому что имя файла жестко закодировано в нем. Один выход, согласно последнему посту, состоит в том, чтобы установить переменную version_type в none (version_type = none) в разделе linux файла. В вашем случае настройки сборки могут немного отличаться, но, возможно, стоит взглянуть на изменения, которые они внесли в это обсуждение.

3
Joy Patra

Здесь: http://silverglint.com/boost-for-Android/ Вы можете найти простой и безболезненный новый способ создания современной (например, 1.67.0) версии boost для Android ,.

Также включен пример приложения, которое показывает вам, как использовать встроенные бинарные файлы.

В качестве альтернативы вы можете просто скачать готовые двоичные файлы

0
Declan