为 Android NDK R10e 编译和使用 boost
Compile and use boost for Android NDK R10e
如何为 Android NDK 编译和使用 Boost?我已经尝试了我在网上找到的所有东西,从 Boost for 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 应用程序项目中使用它?
最简单的方法是使用 CrystaX NDK, which contains already built and ready-to-use Boost libraries. And here are examples how to use Boost with CrystaX NDK: 1, 2
我们设法为 NDKr10d 编译它。 NDKr10e 应该是一样的。
project-config.bjam 应该指向来自 NDK 的 gcc 编译器。我们的看起来像这样:
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编译,告诉android的路径包括:
b2 --reconfigure <your options>
toolset=gcc-arm
include=<ndk folder>\sources\cxx-stl\gnu-libstdc++.9\include
include=<ndk folder>\sources\cxx-stl\gnu-libstdc++.9\libs\<target platform>\include
include=<ndk folder>\platforms\<android api version>\arch-arm\usr\include
install --libdir=stage\lib\<target platform>
我们即将迁移到 ndkr10e。你能告诉我 boost 是否仍然适用吗? :)
我只能用 10d
构建。使用 Boost for Android 交叉编译 Linux->Android 可以直接使用。
要下载稍微过时的 ndk,因为 Boost for Android 并非立即支持所有 ndk,您可以使用本指南:我在哪里可以找到旧版本的 Android NDK ?
注意:我还想指定工具链。我必须在两个地方做:
在 build-android.sh 中,就在上面提到的行之后:
TOOLCHAIN=${TOOLCHAIN:-arm-linux-androideabi-4.9}
在命令行中
bash build-android.sh [ndk 位置] --toolchain=arm-linux-androideabi-4.9
事实上,当我用 --with-libraries=[comma separated list]
.
准确指定我想要的增强组件时,效果更好
如果我构建所有内容,我会得到:
...failed updating 38 targets...
...skipped 6 targets...
...updated 10568 targets...
ERROR: Failed to build boost for android!
Done!
按照 boost 说明,我能够在 Ubuntu 12.04 上使用 NDKr10e 构建 boost 1.60(尽管我怀疑很少取决于主机系统)。这是我的笔记:
获取并解压缩 boost 源代码压缩包(我使用的是 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
按照 unix 入门 "Build Custom Binaries" 部分中的提升说明进行操作
使用新的空根安装 b2,即 /scratch/boost-build-root;使用 usr 作为前缀;再次遵循提升说明:
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
将 b2 放入路径中(再次按照说明)
export PATH=/scratch/moskewcz/android/boost-build-root/usr/bin:$PATH
在一些 jam 文件中(我没有 ~/user-config.jam,所以我创建了一个并使用了它,也许 create/edit 有更好的 jamfile 选择)添加一些 jam 代码( ?)定义一个 gcc 版本(工具集),从独立的工具链指向 g++。请注意,这是使用 NDK 按照其 'create a standalone toolchain' 说明以正常方式创建的工具链。我没有指向 NDK 本身内部的 g++(这可能有效也可能无效,我不知道):
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 来做 ||构建
moskewcz@maaya:/scratch/moskewcz/android/src/boost_1_60_0$ b2 -j8 --build-dir=bin.v2 toolset=gcc-arm_linux_android_4.9 stage
请注意,这会尝试默认构建静态库和共享库,但由于 android 没有 librt.so,构建共享库失败——根据我的研究,人们声称在 android(其中一些?)librt.so 的功能在 libc.so 中——因此可以简单地从链接步骤中删除 -lrt 以便为 [=46 构建共享库=].我没有尝试这个。见:
https://code.google.com/p/android/issues/detail?id=5730
在这里:http://silverglint.com/boost-for-android/ 您可以找到一种简单而轻松的新方法来为 android 构建现代(例如 1.64.0)版本的 boost。
适用于 clang 和 gcc。
还包括一个示例应用程序,向您展示如何使用由此构建的 boost 二进制文件。
如何为 Android NDK 编译和使用 Boost?我已经尝试了我在网上找到的所有东西,从 Boost for 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 应用程序项目中使用它?
最简单的方法是使用 CrystaX NDK, which contains already built and ready-to-use Boost libraries. And here are examples how to use Boost with CrystaX NDK: 1, 2
我们设法为 NDKr10d 编译它。 NDKr10e 应该是一样的。 project-config.bjam 应该指向来自 NDK 的 gcc 编译器。我们的看起来像这样:
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编译,告诉android的路径包括:
b2 --reconfigure <your options>
toolset=gcc-arm
include=<ndk folder>\sources\cxx-stl\gnu-libstdc++.9\include
include=<ndk folder>\sources\cxx-stl\gnu-libstdc++.9\libs\<target platform>\include
include=<ndk folder>\platforms\<android api version>\arch-arm\usr\include
install --libdir=stage\lib\<target platform>
我们即将迁移到 ndkr10e。你能告诉我 boost 是否仍然适用吗? :)
我只能用 10d
构建。使用 Boost for Android 交叉编译 Linux->Android 可以直接使用。
要下载稍微过时的 ndk,因为 Boost for Android 并非立即支持所有 ndk,您可以使用本指南:我在哪里可以找到旧版本的 Android NDK ?
注意:我还想指定工具链。我必须在两个地方做:
在 build-android.sh 中,就在上面提到的行之后:
TOOLCHAIN=${TOOLCHAIN:-arm-linux-androideabi-4.9}
在命令行中
bash build-android.sh [ndk 位置] --toolchain=arm-linux-androideabi-4.9
事实上,当我用 --with-libraries=[comma separated list]
.
如果我构建所有内容,我会得到:
...failed updating 38 targets...
...skipped 6 targets...
...updated 10568 targets...
ERROR: Failed to build boost for android!
Done!
按照 boost 说明,我能够在 Ubuntu 12.04 上使用 NDKr10e 构建 boost 1.60(尽管我怀疑很少取决于主机系统)。这是我的笔记:
获取并解压缩 boost 源代码压缩包(我使用的是 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
按照 unix 入门 "Build Custom Binaries" 部分中的提升说明进行操作
使用新的空根安装 b2,即 /scratch/boost-build-root;使用 usr 作为前缀;再次遵循提升说明:
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
将 b2 放入路径中(再次按照说明)
export PATH=/scratch/moskewcz/android/boost-build-root/usr/bin:$PATH
在一些 jam 文件中(我没有 ~/user-config.jam,所以我创建了一个并使用了它,也许 create/edit 有更好的 jamfile 选择)添加一些 jam 代码( ?)定义一个 gcc 版本(工具集),从独立的工具链指向 g++。请注意,这是使用 NDK 按照其 'create a standalone toolchain' 说明以正常方式创建的工具链。我没有指向 NDK 本身内部的 g++(这可能有效也可能无效,我不知道):
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 来做 ||构建
moskewcz@maaya:/scratch/moskewcz/android/src/boost_1_60_0$ b2 -j8 --build-dir=bin.v2 toolset=gcc-arm_linux_android_4.9 stage
请注意,这会尝试默认构建静态库和共享库,但由于 android 没有 librt.so,构建共享库失败——根据我的研究,人们声称在 android(其中一些?)librt.so 的功能在 libc.so 中——因此可以简单地从链接步骤中删除 -lrt 以便为 [=46 构建共享库=].我没有尝试这个。见:
https://code.google.com/p/android/issues/detail?id=5730
在这里:http://silverglint.com/boost-for-android/ 您可以找到一种简单而轻松的新方法来为 android 构建现代(例如 1.64.0)版本的 boost。 适用于 clang 和 gcc。
还包括一个示例应用程序,向您展示如何使用由此构建的 boost 二进制文件。