没有sysroot

时间:2017-08-04 10:24:28

标签: android c++ android-ndk native cross-compiling

我正在尝试根据编译标志(通过动态地将Application.mk的路径传递给ndk-build命令)来编译Android NDK的多个体系结构和多个API级别的源代码。直到r12才好。现在我试图将我的构建系统更新到最新的NDK r15c,并发现它从" android-ndk / sysroot /..."中获取标题;路径而不是取决于Application.mk文件中的APP_PLATFORM标志

APP_PLATFORM                   := android-19

r12b NDK的日志:

-I/data/android/android-ndk-r10d/platforms/android-19/arch-arm/usr/include

当我为ndk-build(V = 1)尝试详细日志时,会出现以上包含路径。

r15c NDK的日志:

--sysroot
/home/airwatch/Android/android-ndk/sysroot
-isystem
/home/airwatch/Android/android-ndk/sysroot/usr/include/arm-linux-androideabi

当我尝试r15c NDK的详细日志时,会出现以上包含路径。

由于我的项目要求,无法配置Standalone Toolchain。反正有没有摆脱这个sysroot?

1 个答案:

答案 0 :(得分:3)

正如上面的评论所述,这里有完整的解释:https://android.googlesource.com/platform/ndk/+/master/docs/UnifiedHeaders.md

  

统一标题

     

在NDK r14之前,我们为每个API版本提供了一组libc标头。在   很多情况下这些标题不正确。许多暴露的API没有   存在,而其他人没有暴露那些已经发布的API。

     

在NDK r14(作为选择加入功能)中,我们将这些统一为一组   标题,称为统一标题。使用此单个标头路径   适用于每个平台级别。 API级别防护用#ifdef处理。   这些标题可以在prebuilts / ndk / headers中找到。

     

统一标头直接由Android平台构建,因此它们   是最新的和正确的(或至少,NDK中的任何错误   标题也将是平台标题中的错误,这意味着我们会这样做   更有可能找到它们。)

     

在r15中,默认使用统一标头。在r16中,旧标题   已被删除。

     

已知问题

     
      
  • 开箱即用不支持使用GCC的独立工具链。至   使用GCC,编译时传递-D__ANDROID_API __ = $ API。注意:这不是   我们将要解决的问题。
  •   
     

在构建中支持统一标头   系统

     
      
  1. 与使用相比,统一标头只需要进行一些更改   弃用的NDK标头。作为参考,这个补丁添加了支持   ndk-build:https://android-review.googlesource.com/c/239934/
  2.         

    编译时间sysroot现在是$ NDK / sysroot。以前这是   $ NDK /平台/ android- $ API / arch- $ ARCH。

         
        
    1. 编译时传递-isystem $NDK/sysroot/usr/include/$TRIPLE。该   triple具有以下映射:
    2.         

      Arch Triple
        ARM arm-linux-androideabi
        ARM64 aarch64-linux-android
        MIPS mipsel-linux-android
        MIPS64 mips64el-linux-android
        x86 i686-linux-android
        x86_64 x86_64-linux-android

           

      这是必需的   特定于体系结构的标头,例如asm /和machine /中的标头。我们   计划教Clang的驱动程序自动搜索架构   具体包含目录,但尚未完成。

           
          
      1. 编译时传递-D__ANDROID_API__=$API。这个定义曾经是   由<android/api-level.h>提供,但只有一组标题   这已经不可能了。将来我们会考虑添加   -mandroid-version或类似于Clang所以这是自动的。

      2.   
      3. 在链接时,不做任何改动。所有链接时间构建行为都应该   匹配已弃用的标头行为。 --sysroot仍然应该指出   $ NDK /平台/ android- $ API / arch- $ ARCH /.

      4.