android - 在发布构建版本中通过优化本机代码来防止删除特定函数或类
问题描述
在尝试为 64 位设备构建 APK 时,编译器似乎对本机 CPP 代码进行了额外的优化,这破坏了我的应用程序的一些核心功能。当我使用标志构建时,#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O0")
它工作正常。
我想弄清楚
- 如果我可以阻止编译器进行某些破坏功能的优化。
或者
- 如果我能理解为什么编译器会通过类似这样的方式将我的代码视为未使用的代码
在实现第一个选项的过程中,我尝试根据此处pragma
的答案使用预处理器指令
- 通过使用所需函数之前的行, - 也通过使用文件开头的行。#pragma optimize("", off)
#pragma GCC optimize ("O0")
但是,我在共享库中看到了相同的符号集,并且似乎对构建过程没有影响。似乎 NDK r18 已经有 GCC 4.9 版,这应该意味着 pragma 指令应该可以正常工作,但我不知道它为什么会失败。
我也尝试使用属性
__attribute__((optimize("O0")))
。但是在此之后也看不到符号被添加到我的共享库中。
所以我想问一下是否支持pragma
或attribute(optimize)
仍然支持,以及我是否在这里做错了什么。或者如果有更好的方法来解决这个问题或者了解如何防止编译器优化所需的函数。
解决方案
推荐阅读
- c++ - 如何用 1 和 0 填充大小为 10 的一维数组的随机位置
- revit-api - 如何在 Revit 中使用 Revit API 在所有其他墙壁中沿特定轴选择墙壁?
- outlook-addin - 拖放到 Outlook 加载项
- swift - 我最初在我的应用程序中使用环境对象来管理我的应用程序中的状态,但现在需要 coreData。我应该删除环境对象吗?
- javascript - 使用 javascript 选择带有 2 个参数的链接
- javascript - 如何在 JavaScript 中点击其他元素?
- excel - VBA 复制目标的格式不仅仅是值
- django - 上传文件的 read_excel 上的 Shiftleft 扫描 (SLS) 漏洞
- html - 我在 css 中为侧边栏菜单创建简单菜单
- angular - Angular / Spring Boot:Angular Service 向 localhost:4200 而不是 localhost:8080 发出 Http 请求