我正在尝试根据编译标志(通过动态地将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?
答案 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。注意:这不是 我们将要解决的问题。
在构建中支持统一标头 系统
- 与使用相比,统一标头只需要进行一些更改 弃用的NDK标头。作为参考,这个补丁添加了支持 ndk-build:https://android-review.googlesource.com/c/239934/
醇>编译时间
sysroot
现在是$ NDK / sysroot。以前这是 $ NDK /平台/ android- $ API / arch- $ ARCH。
- 编译时传递
醇>-isystem $NDK/sysroot/usr/include/$TRIPLE
。该 triple具有以下映射: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的驱动程序自动搜索架构 具体包含目录,但尚未完成。
编译时传递
-D__ANDROID_API__=$API
。这个定义曾经是 由<android/api-level.h>
提供,但只有一组标题 这已经不可能了。将来我们会考虑添加 -mandroid-version或类似于Clang所以这是自动的。- 醇>
在链接时,不做任何改动。所有链接时间构建行为都应该 匹配已弃用的标头行为。
--sysroot
仍然应该指出 $ NDK /平台/ android- $ API / arch- $ ARCH /.