首页 > 解决方案 > 在 NDK 中启用链接时间优化时出现链接器错误

问题描述

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

有谁知道如何解决这个问题?

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

笔记:

标签: c++android-ndkandroid-gradle-pluginclang++

解决方案


答案分两部分:

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

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

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


推荐阅读