android - Gradle 无法使用 OBJECT 库构建 CMake 项目,因为它需要一个输出文件

标签 android gradle cmake

我的 build.gradle 文件包含此文件以使用 CMake 构建项目:

   externalNativeBuild {
    cmake {
        // Provides a relative path to your CMake build script.
        version "3.13.0+"
        path "../subproj/smcxx/CMakeLists.txt"
    }
}

CMakeList.txt 定义了多个目标,但有问题的是:

set(SOURCES "src/lib.cc")
add_library(smcxx_obj OBJECT ${SOURCES})

OBJECT 目标不会生成 .so.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 目标的检查?

最佳答案

根据documentation :

Gradle builds all executables and shared object libraries that you define in your CMake (or ndk-build) project.

但是,似乎根本不支持 CMake 对象库,这会导致您遇到问题。我实际上认为这是一个错误:Gradle 应该跳过构建它们,因为它们大多只在 CMake 本身中有用。

无论如何,您可以通过手动指定您希望 Gradle 构建哪些 CMake 目标来解决此问题(例如,只需省略对象库目标就可以了):

android {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      ...
      cmake {
        targets "target1", "target2"
      }
    }
  }

关于android - Gradle 无法使用 OBJECT 库构建 CMake 项目,因为它需要一个输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58729852/

相关文章:

android - 多个 Realm 的 Realm 唯一约束

java - 将序列化的 json 字符串分解为 Android 的 jsonObjects 数组

gradle - 在耳朵上的 jar 上设置Gradle设置 list 类路径

android - 找不到参数[androidx.appcompat:appcompat:1.1.0-rc01]的方法Implementation()

python - 在 OSX 10.10 上链接 Boost Python

c++ - 从 CMake 创建 Visual Studio 项目,Visual Studio 找不到可执行文件

android - 在代码中动态创建选项卡 - Android Studio 3.5

gradle - 如何在BuildGradle任务中使用startParameters?

cmake - 如何在 MacOS 上使用 CMake 设置多个 RPATH 目录

安卓 12 崩溃。华为服务