【问题标题】:How to know the gcc optimization level for ndk-build如何知道 ndk-build 的 gcc 优化级别
【发布时间】:2012-02-28 16:40:54
【问题描述】:

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

我写了一些代码来测试这样的循环开销:

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

}
// gettime

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

我如何知道 gcc(ndk-build) 使用的优化级别,我可以将 make 设置为详细以获取所有消息吗?

提前致谢。

【问题讨论】:

  • 10k incs 很有可能在 10k 个时钟周期内完成。即使在“慢速”处理器上,这也真的快。

标签: gcc android-ndk makefile java-native-interface compiler-optimization


【解决方案1】:

在此处查看如何禁用优化:Android NDK assert.h problems

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

APP_OPTIM := debug

到您的 Application.mk 文件

【讨论】:

    【解决方案2】:

    当启用优化时,编译器会定义一个名为 __OPTIMIZE__ 的宏。

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

    #ifdef __OPTIMIZE__
    #error Optimization enabled. That's not right!
    #endif
    

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

    readelf -A myfile.o
    

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

    【讨论】:

    • 是的,我用你的代码检查了它,-O0 不起作用,编译器只是抛出错误消息。那么如何正确关闭android-jni项目的优化呢?
    猜你喜欢
    • 2012-07-24
    • 2010-12-19
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2011-06-14
    相关资源
    最近更新 更多