My 构建.gradle文件包含以下内容以使用 CMake 构建项目:
externalNativeBuild {
cmake {
// Provides a relative path to your CMake build script.
version "3.13.0+"
path "../subproj/smcxx/CMakeLists.txt"
}
}
The CMakeList.txt定义了多个目标,但有问题的是:
set(SOURCES "src/lib.cc")
add_library(smcxx_obj OBJECT ${SOURCES})
An OBJECT目标不会建立一个.so
or .a
文件,而不是.o
文件可以在其他目标中使用。
问题是(根据我的理解)Gradle 分析 CMake 目标并期望每个目标都有一个输出文件。当我使用编译整个项目时gradlew,我收到以下错误消息:
> Task :app:externalNativeBuildDebug FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Expected output file at /home/cytrinox/src/androidapp/app/.cxx/cmake/debug/armeabi-v7a/smcxx_obj for target smcxx_obj but there was none
目标文件lib.cc.o已成功编译并存在。但没有smcxx_obj文件夹也不是smcxx_obj.so文件(这是预期的)。
是否可以解决此错误,例如通过告诉 Gradle 跳过对特定 CMake 目标的检查?
根据文档 https://developer.android.com/studio/projects/gradle-external-native-builds:
Gradle 构建您在 CMake(或 ndk-build)项目中定义的所有可执行文件和共享对象库。
但是,CMake 对象库似乎根本不受支持,并导致您遇到问题。我实际上相信这是一个错误:Gradle 应该跳过构建它们,因为它们大多只在 CMake 本身中有用。
无论如何,您可以通过手动指定您希望 Gradle 构建哪些 CMake 目标来解决此问题(例如,只需省略对象库目标就可以了):
android {
...
defaultConfig {
...
externalNativeBuild {
...
cmake {
targets "target1", "target2"
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)