【问题标题】:Using -Os/-Oz with Android NDK and cmake for release builds使用 -Os/-Oz 和 Android NDK 和 cmake 进行发布构建
【发布时间】:2018-06-22 08:48:03
【问题描述】:

使用:Andorid Studio 3.1.3、NDKr17b、gradle plugin 3.1.3、gradle-4.5.1-all.zip

我无法使用 cmake 生成共享库的任何发布版本,它失败并显示以下内容:

arm-linux-androideabi/bin/ld: fatal error: Optimization level must be between 0 and 3

这是我使用的 cmake 发布配置

    release {
        externalNativeBuild {
            cmake {
                arguments "-DCMAKE_BUILD_TYPE=Release",
                        "-DANDROID_CPP_FEATURES=rtti exceptions",
                        "-DANDROID_STL=c++_static",
                        "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"

                cppFlags "-ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -Os"
                cFlags   "-ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -Os"
            }
        }
        consumerProguardFiles 'proguard-project.txt'
    }

我发现使用以下选项调用 ld:

-plugin /home/myhome/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib64/LLVMgold.so -plugin-opt=mcpu=generic -plugin-opt=Os -plugin-opt=-function-sections -plugin-opt=-data-sections

问题是“-plugin-opt=Os”的存在,当我运行没有此选项的命令时,它会链接,即使所有源代码都以适当的优化级别编译。 使用与 ndk-build 相同的配置可以正常工作(ld 调用没有这样的选项,它只是加载 LLVMgold.so 插件,没有 --plugin-opt=Os)。

所以我的问题是为什么要应用此选项“-plugin-opt=Os”,我该如何删除它?这是来自 cmake 还是来自 ninja?

【问题讨论】:

    标签: gradle cmake android-ndk


    【解决方案1】:

    我知道你也是这个错误的提交者,但对于其他登陆这里的人来说,这是 Clang LTO 插件中的一个错误:https://github.com/android-ndk/ndk/issues/721

    【讨论】:

      【解决方案2】:

      即使这是 Clang LTO 插件 (https://reviews.llvm.org/D30920) 中的错误 - 可以避免 - 请注意 ndk-build 系统使用相同的工具链,但不存在此问题。 解决方案是不将 Os 选项传递给 Clang LTO 插件(“-plugin-opt=Os”) 这可以通过从通用 ANDROID_COMPILER_FLAGS_RELEASE 中删除 -Os 选项来完成,而是将此选项直接传递给您的 makefile,这样它就不会添加到 Clang LTO 插件中。但由于 ANDROID_COMPILER_FLAGS_RELEASE 不是用户变量,唯一的方法是在 Android Sdk 文件夹中的 ndk-bundle/build/cmake/android.toolchain.cmake 中注释两行(510、512)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-13
        • 1970-01-01
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多