2011-07-06 257 views
19

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

回答

10

NDK本身调用构建在arm-eabi-gcc编译器上的定制交叉编译器。有些人使用支持ARM指令集的bog标准GCC实现来创建自定义工具链,但这不是我的联盟。我以前阅读过的大部分内容都是使用NDK附带的工具链来编译本机代码。

推论:大多数抱怨并且必须制作自己的工具链的人都对那些对NDK工具链编译器的(假设的)C++支持不满意的人感到不满。我不能说这个,因为一些文章比较老,而且Android的变化非常迅速。这也不是一个似乎太频繁出现的意见。

+4

它可能只是一个沼气标准的海湾合作委员会,但建立了正确的选项集。理论上,'gcc -v'输出应该显示一行'Configured with:...'显示GCC是如何构建的。当然,在NDK的某些'bin'目录中用'some-prefix-gcc'替换'gcc'。 – rubenvb

+0

@rubenvb最有可能。但是因为我不能为谷歌发言,所以我不能以任何信心来说。 –

+0

谢谢,有道理。 – Phonon

18

关于NDK R8D它可以在2种方法(参见Andriod ndk)来修改:

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

默认编译器在NDK /建造/型芯/ setup-toolchain.mk设置(参见NDK_TOOLCHAIN和NDK_TOOLCHAIN_VERSION)

6

GCC是有利于铛的,不赞成使用NDK 11(2016年3月)

提到的官方版本的历史: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