【问题标题】:Which compiler does Android NDK use?Android NDK 使用哪个编译器?
【发布时间】:2011-09-29 23:35:46
【问题描述】:

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

【问题讨论】:

    标签: android gcc compiler-construction android-ndk arm


    【解决方案1】:

    关于 NDK r8d,它可以通过 2 种方式进行修改(参见 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)

    【讨论】:

      【解决方案2】:

      NDK 本身调用基于arm-eabi-gcc 编译器的自定义交叉编译器。有一些例子表明人们使用支持 ARM 指令集的沼泽标准 GCC 实现来创建自定义工具链,但这超出了我的范围。我过去读过的大部分内容都讨论过使用 NDK 中包含的工具链来编译原生代码。

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

      【讨论】:

      • 它可能只是一个沼泽标准 GCC,但使用正确的选项集构建。理论上,gcc -v 输出应该显示一行 Configured with: ... 显示 GCC 是如何构建的。当然,在 NDK 的一些 bin 目录中将 gcc 替换为匹配的 some-prefix-gcc
      • @rubenvb 很有可能。但由于我不能代表 Google 说话,所以我不能自信地说出这句话。
      • 您可以下载 NDK,并且会有一个 build/tools/toolchain-patches 文件夹,其中包含大多数“琐碎”的 GCC 构建补丁,可用于 Android 的系统库。所以,是的,它(几乎)是普通的 GCC。
      • android ndk改为使用clang,所以这个答案不再正确
      【解决方案3】:

      自 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

      【讨论】:

        猜你喜欢
        • 2014-05-03
        • 2011-10-25
        • 1970-01-01
        • 2014-02-14
        • 2011-08-15
        • 2011-07-09
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        相关资源
        最近更新 更多