c++ - 在 NDK 中启用链接时间优化时出现链接器错误

标签 c++ android-ndk android-gradle-plugin clang++

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

关于c++ - 在 NDK 中启用链接时间优化时出现链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56238019/

相关文章:

android - 如何覆盖 Robolectric 运行时依赖库 URL?

c++ - 如何查看gdb内部智能指针的内部数据?

android - NativeActivity 全屏和导航隐藏没有 java 代码?

android - Gradle git 依赖项

java - 授予 Android 应用程序 (.apk) 文件根访问权限

java - Android NDK多线程 block UI响应

android-studio - AndroidStudio 2.1 + Gradle 2.13-更改了将可绘制工件限制为.png和.xml文件的新规则

c# - 用于良好编程实践的 Visual Studio 工具

c++ - 操作系统开发。如何开始?

c++ - 避免 GUI 在多线程操作时卡住