【问题标题】:Linker error when enabling Link Time Optimization in NDK在 NDK 中启用链接时间优化时出现链接器错误
【发布时间】:2019-05-21 12:11:15
【问题描述】:

当我将标志 -flto 添加到我的 NDK C++ 项目时,链接器会发出以下错误:“优化级别必须介于 0 和 3 之间”,即使我的优化级别通过 -O3. 明确设置为 3

有人知道怎么解决吗?

编译器标志是通过 Gradle 传递的,据我所知,它应该将标志传递给 Clang 编译器和链接器。当我删除 -flto 标志时,一切正常。

注意事项:

  • 我正在使用 NDK 19.2(我写这篇文章时的最新版本)。

  • 如果我在没有链接时间优化的情况下进行编译,我也会收到警告 "clang++.exe: warning: argument unused during compilation: '-Wa,--noexecstack' [-Wunused-command-line-argument]"

【问题讨论】:

  • 好吧,我可能真的很蠢,我想 0 和 3 之间的意思是 1 或 2 :)
  • -O3 的设置如何?
  • 同样通过 gradle,我觉得 flto 和 O3 不兼容很奇怪
  • 但是怎么做呢?你在打什么?你要改变什么变量?
  • 感谢您抽出宝贵时间,我已将相关的原生构建配置放在此文件中:toppluva.com/misc/gradle_flto.txt 唯一的构建参数是 gradle 部分中的 -flto。

标签: c++ android-ndk android-gradle-plugin clang++


【解决方案1】:

答案分两部分:

错误是由https://github.com/android-ndk/ndk/issues/721 引起的。 Clang 的 LTO 插件不接受 -Os-Oz。这是一个错误。

好吧,我可能真的很愚蠢,我想 0 到 3 之间的意思是 1 或 2 :)

这实际上是因为您不能使用通用的cppFlags 来设置优化级别。这对应于CMAKE_CXX_FLAGS,您需要在CMAKE_CXX_FLAGS_DEBUGCMAKE_CXX_FLAGS_RELEASE(和/或它们的C 风格)中设置它们。 CMake 在这些变量中有自己的默认值,并且命令行构建为 ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE},因此您的 -O3 将被默认覆盖。

【讨论】:

  • 谢谢,它有效!如果其他人正在为此苦苦挣扎(并且不掌握 CMake),请将 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -flto=full") 添加到 CMakeLists.txt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
相关资源
最近更新 更多