【问题标题】:Compile and use boost for Android NDK R10e为 Android NDK R10e 编译和使用 boost
【发布时间】:2015-08-10 01:15:14
【问题描述】:

如何为 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 应用项目中使用它?

【问题讨论】:

    标签: android c++ boost android-ndk


    【解决方案1】:

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

    【讨论】:

    • 不,crystax-ndk-10.3.1 中没有 Boost 库文件夹。
    【解决方案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++\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是否仍然可以使用它吗? :)

    【讨论】:

    • 我最终使用了我找到的预构建的 Boost 库。它有效,但我也会尝试根据您的建议进行编译。谢谢! github.com/emileb/Boost-for-Android-Prebuilt
    • 您能对要完成的操作更精确一点吗?例如,我没有 project-config.bjam 文件。
    【解决方案3】:

    我只设法使用10d 构建。交叉编译 Linux->Android 使用 Boost for 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 位置] --toolchain=arm-linux-androideabi-4.9

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

    如果我要构建所有东西,我会得到:

    ...更新 38 个目标失败...

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

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

    错误:无法为 android 构建 boost!

    完成!

    【讨论】:

      【解决方案4】:

      按照 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
      

      按照 boost 说明开始使用 unix“构建自定义二进制文件”部分

      使用新的空根安装 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 (?) 来定义 gcc版本(工具集)指向独立工具链中的 g++。请注意,这是一个使用 NDK 以正常方式创建的工具链,遵循其“创建独立工具链”的指示。我不是指向 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"

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-14
          • 2011-08-15
          • 2018-01-04
          相关资源
          最近更新 更多