我正在为Android应用程序编写基于ARM NEON的代码,我正在努力解决某些编译器标志无法识别的问题。我后来意识到对这些标志的支持最近才添加,而且我的GCC版本更旧了。我正在Windows上做整件事,并受到Cygwin提供的版本的限制。这是我的问题:在我尝试在我的Windows机器上构建GCC 4.6.0并让Cygwin喜欢它之前,它会对我有用还是NDK使用它自己的GCC版本而我的升级根本不会影响它?如果是,是否可以告诉它使用不同的编译器?
答案 0 :(得分:18)
关于NDK r8d,可以通过两种方式对其进行修改(参见Andriod ndk):
--toolchain=arm-linux-androideabi-4.7
默认编译器在ndk / build / core / setup-toolchain.mk中设置(请参阅NDK_TOOLCHAIN和NDK_TOOLCHAIN_VERSION)
答案 1 :(得分:11)
NDK本身调用基于arm-eabi-gcc
编译器构建的自定义交叉编译器。有些人使用bog标准的GCC实现来创建自定义工具链,并支持ARM指令集,但这种情况已经超出了我的联盟。我过去阅读过的大多数内容总是使用NDK附带的工具链进行讨论,以编译本机代码。
推论:大多数抱怨并且不得不制作自己的工具链的人都是那些对NDK工具链编译器的(假设的)低于标准的C ++支持感到不安的人。我不能说这个,因为有些文章比较老,而Android的变化也很快。它也不是一个似乎经常出现的意见。
答案 2 :(得分:6)
从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
。