当我将标志 -flto
添加到 NDK C++ 项目时,链接器会发出以下错误:“优化级别必须在 0 到 3 之间”,即使我的优化级别显式设置为 3通过-O3。
有人知道如何解决这个问题吗?
编译器标志是通过 Gradle 传递的,据我了解,Gradle 应该将标志传递给 Clang 编译器和链接器。当我删除 -flto
标志时,一切正常。
注释:
我使用的是 NDK 19.2(我撰写本文时的最新版本)。
我还收到警告
“clang++.exe:警告:编译期间未使用参数:'-Wa,--noexecstack'[-Wunused-command-line-argument]”
如果我在没有链接时间优化的情况下进行编译,则不会。
最佳答案
答案分为两部分:
该错误是由 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
(和/或其中的 C 风格)中设置它们。 CMake 在这些变量中有自己的默认值,并且命令行构建为 ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}
,因此您的 -O3
将被默认值覆盖。
关于c++ - 在 NDK 中启用链接时间优化时出现链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56238019/