如何知道ndk-build的gcc优化级别

Gen*_*Liu 4 java-native-interface gcc makefile compiler-optimization android-ndk

我正在使用NDK(jni)在Android上编写一些本机代码.我想关闭gcc编译器优化.现在我添加LOCAL_CFLAGS += -O0到Android.mk,我不确定它是否正常工作.

我写了一些代码来测试循环开销,如下所示:

// gettime
for(int i = 0 ; i<10000;i++)
{

}
// gettime
Run Code Online (Sandbox Code Playgroud)

时间差太小,我确信循环已被编译器删除.我可以更改i为volatile变量,但我想测试是否已正确关闭编译器优化.

我怎么知道gcc(ndk-build)使用的优化级别,我可以设置make为verbose来获取所有消息吗?

提前致谢.

Mār*_*iko 8

请参见此处如何禁用优化:Android NDK assert.h问题

基本上你需要做的就是添加

APP_OPTIM := debug
Run Code Online (Sandbox Code Playgroud)

到您的Application.mk文件


ams*_*ams 6

编译器定义__OPTIMIZE__在启用优化时命名的宏.

如果将这些行插入任何C文件,那么如果make标志不适用于该文件,则编译将失败.

#ifdef __OPTIMIZE__
#error Optimization enabled. That's not right!
#endif
Run Code Online (Sandbox Code Playgroud)

另一种可能性是检查构建的二进制文件(.o或可执行文件)上的特定于arch的标志.

readelf -A myfile.o
Run Code Online (Sandbox Code Playgroud)

ARM有一个标志,指示优化级别,但我认为Android工具链可能有点旧,因此正确使用,所以YMMV.