使用: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还是来自忍者?
答案 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)