首页 > 解决方案 > 在发布构建版本中通过优化本机代码来防止删除特定函数或类

问题描述

在尝试为 64 位设备构建 APK 时,编译器似乎对本机 CPP 代码进行了额外的优化,这破坏了我的应用程序的一些核心功能。当我使用标志构建时,#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O0")它工作正常。

我想弄清楚

  1. 如果我可以阻止编译器进行某些破坏功能的优化。

或者

  1. 如果我能理解为什么编译器会通过类似这样的方式将我的代码视为未使用的代码

在实现第一个选项的过程中,我尝试根据此处pragma的答案使用预处理器指令 - 通过使用所需函数之前的行, - 也通过使用文件开头的行。
#pragma optimize("", off)#pragma GCC optimize ("O0")

但是,我在共享库中看到了相同的符号集,并且似乎对构建过程没有影响。似乎 NDK r18 已经有 GCC 4.9 版,这应该意味着 pragma 指令应该可以正常工作,但我不知道它为什么会失败。

我也尝试使用属性 __attribute__((optimize("O0")))。但是在此之后也看不到符号被添加到我的共享库中。

所以我想问一下是否支持pragmaattribute(optimize)仍然支持,以及我是否在这里做错了什么。或者如果有更好的方法来解决这个问题或者了解如何防止编译器优化所需的函数。

标签: androidc++cmake

解决方案


推荐阅读