c++ - 在 NDK 中启用链接时间优化时出现链接器错误
问题描述
当我将标志添加-flto
到我的 NDK C++ 项目时,链接器会发出以下错误:“优化级别必须介于 0 和 3 之间”,即使我的优化级别通过显式设置为 3-O3.
有谁知道如何解决这个问题?
编译器标志是通过 Gradle 传递的,据我所知,它应该将标志传递给 Clang 编译器和链接器。当我删除-flto
标志时,一切正常。
笔记:
我正在使用 NDK 19.2(我写这篇文章时的最新版本)。
"clang++.exe: warning: argument unused during compilation: '-Wa,--noexecstack' [-Wunused-command-line-argument]"
如果我在没有链接时间优化的情况下进行编译,我也会收到警告。
解决方案
答案分两部分:
该错误是由https://github.com/android-ndk/ndk/issues/721引起的。Clang 的 LTO 插件就是不接受-Os
或-Oz
. 这是一个错误。
好吧,我可能真的很愚蠢,我想 0 到 3 之间意味着 1 或 2 :)
这实际上是因为您不能使用泛型cppFlags
来设置优化级别。这对应于CMAKE_CXX_FLAGS
, 您需要将它们设置为CMAKE_CXX_FLAGS_DEBUG
and CMAKE_CXX_FLAGS_RELEASE
(和/或它们的 C 风格)。CMake 在这些变量中有自己的默认值,并且命令行构建为${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}
,因此您-O3
的默认值被覆盖。
推荐阅读
- python - 填充数据框列比 iterrows 更好的方法 - python + pandas
- javascript - 在css中,如何在保持其纵横比的同时最大化div内的图像大小?
- javascript - 导入 Handlebar 模板和获取它们之间的区别?
- macos - 如何将 isAlternative 与带有 customView 的 NSMenuItem 一起使用?
- oracle - SQL Plus 是否可以验证是否可以运行 sql 脚本?
- java - Java如何在新线程上打开异常而不是引发异常的线程
- codenameone - 在代号中居中标签的标准方法是什么?
- c++ - 我是否需要用 C++ 中的花括号将 case 的主体包裹在 switch 语句中?
- python - python函数中的正确方式提示'->'多个返回类型
- vuetify.js - 如何禁用 Vuetify v-expansion-panel 组件的动画?