Подтвердить что ты не робот

Компиляция и использование для Android NDK R10e

Как скомпилировать и использовать Boost для Android NDK? Я пробовал все, что нашел в Интернете, от Boost для Android, чтобы скомпилировать его сам с файлом bjam. Однако мне это не удается. Когда я пытаюсь скомпилировать его с помощью bjam, я получаю следующую ошибку:

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

Кто-нибудь успешно использовал Boost с Android NDK R10e?

И когда я смогу его скомпилировать, как мне его использовать, чтобы использовать его в своем проекте приложений Android?

4b9b3361

Ответ 1

Нам удалось скомпилировать его для NDKr10d. Он должен быть таким же для NDKr10e. Project-config.bjam должен указывать на компилятор gcc из NDK. Наши выглядят так:

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 ; 

Затем просто скомпилируйте с помощью b2, указав пути к андроиду, включите:

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>

Мы собираемся перейти на ndkr10e. Не могли бы вы сказать, работает ли boost с ним?:)

Ответ 2

Самый простой способ - использовать CrystaX NDK, который содержит уже построенные и готовые к использованию библиотеки Boost. И вот примеры использования Boost с CrystaX NDK: 1, 2

Ответ 3

Следуя инструкциям по ускорению, я смог построить boost 1.60 с NDKr10e на Ubuntu 12.04 (хотя я подозреваю, что очень мало зависит от хост-системы). Вот мои заметки:

получить и распаковать форматированный исходный архив (я использовал 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

следуйте инструкциям по ускорению при запуске в разделе unix "Создание пользовательских бинарных файлов"

используйте новый пустой root для установки b2 i.e./scratch/boost-build-root; использовать usr как префикс; снова следуя инструкциям ускорения:

[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 в путь (снова в соответствии с инструкциями)

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

в некотором jamfile (у меня не было ~/user-config.jam, поэтому я создал его и использовал, возможно, там был лучший выбор jamfile для создания/редактирования), добавьте некоторый код jam (?), чтобы определить gcc version (toolset), указывающий на g++ из автономной toolchain. обратите внимание, что это инструментальная цепочка, созданная с помощью NDK, в обычном режиме, следуя указаниям "создать автономную привязку". Я НЕ указываю на g++ внутри самого NDK (что может или не может работать, я не знаю):

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

пойти, чтобы увеличить корень проекта и построить, в основном по направлениям. --build-dir может быть необязательным? также добавил -j8 сделать || построить

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

обратите внимание, что это пытается создать как статические, так и общие библиотеки по умолчанию, но создание общих libs не выполняется из-за того, что у android нет librt.so - согласно моим исследованиям, люди утверждают, что под андроидом (некоторые из?) функциональность librt.so находится внутри libc.so - поэтому вполне возможно просто удалить -lrt из шагов компоновки, чтобы создать общие библиотеки для Android. Я не пытался это сделать. см:

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

Building Boost для Android с ошибкой "не может найти -lrt"

Ответ 4

Мне удалось создать только 10d. Кросс-компиляция Linux- > Android с помощью Boost для Android сразу сработала.

Чтобы загрузить немного устаревший ndk, поскольку не все ndk сразу поддерживаются Boost для Android, вы можете использовать это руководство: Где найти старые версии Android NDK?

Примечание. Я также хотел указать toolchain. Я должен был сделать это в двух местах:

  • В build-android.sh сразу после строки, указанной выше:

    ToolChain = ${ToolChain: -arm-Linux-androideabi-4,9}

  • В командной строке

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

Фактически, он работал лучше, когда я точно определял, какие компоненты ускорения я хотел использовать с --with-libraries=[comma separated list].

Если бы я построил все, я бы получил:

... не удалось обновить 38 целей...

... пропустили 6 целей...

... обновлено 10568 целей...

ОШИБКА: Не удалось создать boost для Android!

Готово!

Ответ 5

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

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