当我将标志-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
和CMAKE_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。