Android NDK 使用哪个编译器?

问题描述 投票:0回答:3

我正在为 Android 应用程序编写基于 ARM NEON 的代码,但我一直在努力解决某些编译器标志无法识别的问题。后来我意识到对这些标志的支持是最近才添加的,而且我的 GCC 版本比较旧。我在 Windows 上完成所有操作,并且受到 Cygwin 提供的版本的限制。这是我的问题:在我尝试在我的 Windows 计算机上构建 GCC 4.6.0 并使 Cygwin 喜欢它之前,它对我有用还是 NDK 使用它自己的 GCC 版本并且我的升级根本不会影响它?如果是,是否可以告诉它使用不同的编译器?

android gcc android-ndk arm
3个回答
18
投票

关于NDK r8d,可以通过两种方式修改(参见Andriod ndk):

  • 对于 ndk-build,导出 NDK_TOOLCHAIN_VERSION=4.7 变量或将其添加到 Application.mk。
  • 对于独立构建,请将 --toolchain= 选项添加到 make-standalone-toolchain.sh
    --toolchain=arm-linux-androideabi-4.7

默认编译器在 ndk/build/core/setup-toolchain.mk 中设置(请参阅 NDK_TOOLCHAIN 和 NDK_TOOLCHAIN_VERSION)


12
投票

NDK 本身调用基于

arm-eabi-gcc
编译器构建的自定义交叉编译器。 有一些例子表明人们使用支持 ARM 指令集的标准 GCC 实现来创建自定义工具链,但这远远超出了我的能力范围。 我过去读过的大部分内容总是讨论使用 NDK 附带的工具链来编译本机代码。

推论:大多数抱怨并不得不制作自己的工具链的人都是对 NDK 工具链编译器的(假定的)低于标准的 C++ 支持感到不安的人。 我不能谈论这个,因为有些文章比较旧,而且 Android 变化如此之快。 这也不是一个似乎经常出现的观点。


10
投票

自 NDK 11(2016 年 3 月)起,GCC 已被弃用,取而代之的是 clang

官方修订历史中提到:https://developer.android.com/ndk/downloads/revision_history.html

询问如何在编译器之间切换:

您可以通过以下方式轻松检查:

enum CONSTEXPR {N = 256};
char s[N];
#ifdef __clang__
        snprintf(s, N, "%s", "clang" __clang_version__);
#else
# ifdef __GNUC__
        snprintf(s, N, "%s %d.%d.%d", "gcc", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
# endif
#endif

然后只需记录

s
或将其返回到
TextView

© www.soinside.com 2019 - 2024. All rights reserved.