将-Os / -Oz与Android NDK和cmake一起使用以进行版本构建

时间:2018-06-22 08:48:04

标签: gradle cmake android-ndk

使用:Andorid Studio 3.1.3,NDKr17b,gradle插件3.1.3,gradle-4.5.1-all.zip

我无法使用cmake生成共享库的任何发行版,但由于以下原因而失败:

writer.close()

这是我使用的cmake版本配置

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

我发现ld具有以下选项:

    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'
    }

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

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

2 个答案:

答案 0 :(得分:0)

我看到您也是该bug的提交者,但是对于其他任何人,这都是Clang LTO插件https://github.com/android-ndk/ndk/issues/721中的bug。

答案 1 :(得分:0)

即使这是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)