为Android NDK R10e编译和使用boost

时间:2015-05-27 19:10:58

标签: android c++ boost android-ndk

如何为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

有没有人成功使用过Android NDK R10e的Boost?

当我可以编译它时,我该如何在我的Android应用程序项目中使用它?

5 个答案:

答案 0 :(得分:6)

我们设法为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++\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。你能判断一下它是否仍适用于它吗? :)

答案 1 :(得分:2)

最简单的方法是使用CrystaX NDK,其中包含已构建且可立即使用的Boost库。以下是如何将Boost与CrystaX NDK一起使用的示例:12

答案 2 :(得分:1)

根据提升方向,我能够在Ubuntu 12.04上使用NDKr10e构建boost 1.60(尽管我怀疑很少取决于主机系统)。以下是我的笔记:

获取并解压缩boost source tarball(我使用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&#34;构建自定义二进制文件&#34;节

使用新的空根来安装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

在一些jamfile中(我没有〜/ user-config.jam,所以我创建了一个并使用了它,也许有更好的选择jamfile来创建/编辑)添加一些jam-code(?)到定义从独立工具链指向g ++的gcc版本(工具集)。请注意,这是一个使用NDK以正常方式创建的工具链,因为它创建了一个独立的工具链&#39;方向。我没有指向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以便为android构建共享库。我没有尝试这个。见:

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

Building Boost for Android with error "cannot find -lrt"

答案 3 :(得分:0)

我只设法使用10d进行构建。使用Boost for Android交叉编译Linux-&gt; Android就可以直接使用它。

要下载稍微过时的ndk,因为Boost for Android不立即支持所有ndk,您可以使用本指南:Where do I find old versions of Android NDK?

注意:我还想指定工具链。我不得不在两个地方做到这一点:

  1. 在build-android.sh中,就在上面提到的行之后:

    TOOLCHAIN = $ {TOOLCHAIN:-arm-Linux的androideabi-4.9}

  2. 在命令行中

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

  3. 事实上,当我使用--with-libraries=[comma separated list]指定我想要的哪个增强组件时,它的效果更好。

    如果相反我会建立一切,我会得到:

      

    ...未能更新38个目标...

         

    ...跳过了6个目标...

         

    ...更新了10568个目标...

         

    错误:无法为Android构建增强功能!

         

    完成!

答案 4 :(得分:0)

在这里:http://silverglint.com/boost-for-android/你可以找到一种简单而无痛的新方法,为Android构建一个现代(例如1.64.0)版本的boost。 适用于clang和gcc。

还包括一个示例应用程序,它向您展示如何使用这样构建的boost二进制文件。