没有sysroot的Android NDK编译

Sum*_*man 2 c++ android native cross-compiling android-ndk

我正在尝试根据编译标志(通过动态地将 Application.mk 的路径传递给 ndk-build 命令)来编译 Android NDK 的多个架构和多个 API 级别的源代码。一直到r12都进展顺利。现在我尝试将构建系统更新到最新的 NDK r15c,发现它从“android-ndk/sysroot/...”路径获取标头,而不是依赖于 Application.mk 文件中的 APP_PLATFORM 标志

APP_PLATFORM                   := android-19
Run Code Online (Sandbox Code Playgroud)

r12b NDK 的日志:

-I/data/android/android-ndk-r10d/platforms/android-19/arch-arm/usr/include
Run Code Online (Sandbox Code Playgroud)

当我尝试 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
Run Code Online (Sandbox Code Playgroud)

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

由于我的项目要求,无法配置独立工具链。有没有办法摆脱这个 sysroot?

Ale*_*kov 6

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

\n\n
\n

统一标头

\n\n

在 NDK r14 之前,我们为每个 API 版本都有一组 libc 标头。在许多情况下,这些标头是不正确的。许多公开的 API 并不存在,而其他 API 则不存在。

\n\n

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

\n\n

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

\n\n

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

\n\n

已知的问题

\n\n
    \n
  • 不支持开箱即用的使用 GCC 的独立工具链。要使用 GCC,请在编译时传递 -D__ANDROID_API__=$API。注意:这不是我们要修复的问题。
  • \n
\n\n

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

\n\n
    \n
  1. 与使用已弃用的 NDK 标头相比,统一标头仅需要进行少量更改。作为参考,此补丁添加了对 ndk-build 的支持: https: //android-review.googlesource.com/c/239934/
  2. \n
\n\n

编译时间sysroot现在是 $NDK/sysroot。以前是\n $NDK/platforms/android-$API/arch-$ARCH。

\n\n
    \n
  1. -isystem $NDK/sysroot/usr/include/$TRIPLE编译时通过。三元组具有以下映射:
  2. \n
\n\n

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

\n\n

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

\n\n
    \n
  1. -D__ANDROID_API__=$API编译时通过。此定义过去由\n 提供<android/api-level.h>,但只有一组标头\n 这不再可能。将来我们将考虑添加\n -mandroid-version 或类似于 Clang 的功能,因此这是自动的。

  2. \n
  3. 在链接时,不进行任何更改。所有链接时构建行为都应与已弃用的标头行为匹配。--sysroot仍应指向\n $NDK/platforms/android-$API/arch-$ARCH/。

  4. \n
\n
\n