在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_DEBUGCMAKE_CXX_FLAGS_RELEASE(和/或其中的C口味(中设置它们。Cmake在这些变量中有自己的默认值,并且命令行被构建为${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE},因此您的-O3被默认值覆盖。

我也遇到了此链接错误,但我以其他方式固定了。

我已经与Arm64和ARMV7的架构进行了跨编译的Android库。对于ARM64来说,一切都可以,但是遇到了ARMV7的链接错误。我发现可以通过在我的cmakelists中注释以下陈述来解决它。txt:

if (${CMAKE_MAJOR_VERSION} GREATER_EQUAL 3 AND ${CMAKE_MINOR_VERSION} GREATER_EQUAL 9)
  cmake_policy(SET CMP0069 NEW)
  set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
  include(CheckIPOSupported)
  check_ipo_supported(RESULT ipo_supported OUTPUT ipo_supported_output)
  if (ipo_supported)
    set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
  endif ()
endif ()

上面的CMAKE语句与IPO设置有关,并且在Android ARMV7进行交叉编译时似乎导致链接错误。

我不知道为什么不应为Android ARMV7启用IPO。

最新更新