我正在使用NDK(jni)在Android上编写一些本机代码。
我想关闭gcc编译器优化。
现在我将LOCAL_CFLAGS += -O0
添加到Android.mk,我不确定它是否正常工作。
我写了一些代码来测试循环开销,如下所示:
// gettime
for(int i = 0 ; i<10000;i++)
{
}
// gettime
时间差太小,我确信循环已被编译器删除。
我可以将i
更改为volatile变量,但我想测试是否已正确关闭编译器优化。
我如何知道gcc(ndk-build)使用的优化级别,我可以将make
设置为详细以获取所有消息吗?
提前致谢。
答案 0 :(得分:8)
答案 1 :(得分:6)
编译器在启用优化时定义名为__OPTIMIZE__
的宏。
如果将这些行插入任何C文件,那么如果make标志不适用于该文件,则编译将失败。
#ifdef __OPTIMIZE__
#error Optimization enabled. That's not right!
#endif
另一种可能性是检查构建的二进制文件(.o或可执行文件)上的特定于arch的标志。
readelf -A myfile.o
ARM有一个标志,指示优化级别,但我认为Android工具链可能有点旧,所以YMMV。