Link在 NDK 中启用 Link 时间优化时出错
Linker error when enabling Link Time Optimization in NDK
当我将标志 -flto
添加到我的 NDK C++ 项目时,linker 发出以下错误:"Optimization level must be between 0 and 3",即使我的优化级别通过 -O3.
有人知道怎么解决吗?
编译器标志通过 Gradle 传递,据我所知,应该将标志传递给 Clang 编译器和 linker。当我删除 -flto
标志时,一切正常。
备注:
我正在使用 NDK 19.2(我写这篇文章时的最新版本)。
我也收到了警告 "clang++.exe: warning: argument unused during compilation: '-Wa,--noexecstack' [-Wunused-command-line-argument]"
,如果我在没有 link 时间优化的情况下编译,我就不会收到警告。
答案分为两部分:
错误是由https://github.com/android-ndk/ndk/issues/721引起的。 Clang 的 LTO 插件不接受 -Os
或 -Oz
。这是一个错误。
Okay, I might be really stupid, I suppose between 0 and 3 means 1 or 2 :)
实际上是因为您不能使用通用的 cppFlags
来设置优化级别。这对应于 CMAKE_CXX_FLAGS
,您需要在 CMAKE_CXX_FLAGS_DEBUG
和 CMAKE_CXX_FLAGS_RELEASE
中设置它们(and/or 它们的 C 风格)。 CMake 在这些变量中有自己的默认值,命令行构建为 ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}
,因此您的 -O3
被默认覆盖。
当我将标志 -flto
添加到我的 NDK C++ 项目时,linker 发出以下错误:"Optimization level must be between 0 and 3",即使我的优化级别通过 -O3.
有人知道怎么解决吗?
编译器标志通过 Gradle 传递,据我所知,应该将标志传递给 Clang 编译器和 linker。当我删除 -flto
标志时,一切正常。
备注:
我正在使用 NDK 19.2(我写这篇文章时的最新版本)。
我也收到了警告
"clang++.exe: warning: argument unused during compilation: '-Wa,--noexecstack' [-Wunused-command-line-argument]"
,如果我在没有 link 时间优化的情况下编译,我就不会收到警告。
答案分为两部分:
错误是由https://github.com/android-ndk/ndk/issues/721引起的。 Clang 的 LTO 插件不接受 -Os
或 -Oz
。这是一个错误。
Okay, I might be really stupid, I suppose between 0 and 3 means 1 or 2 :)
实际上是因为您不能使用通用的 cppFlags
来设置优化级别。这对应于 CMAKE_CXX_FLAGS
,您需要在 CMAKE_CXX_FLAGS_DEBUG
和 CMAKE_CXX_FLAGS_RELEASE
中设置它们(and/or 它们的 C 风格)。 CMake 在这些变量中有自己的默认值,命令行构建为 ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}
,因此您的 -O3
被默认覆盖。