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

问题描述 投票:0回答:2

我的 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 编译整个项目时,我收到以下错误消息:

> 任务:app:externalNativeBuildDebug 失败

失败:构建失败并出现异常。

* 出了什么问题:
任务“:app:externalNativeBuildDebug”执行失败。
> 目标 smcxx_obj 的预期输出文件位于 /home/cytrinox/src/androidapp/app/.cxx/cmake/debug/armeabi-v7a/smcxx_obj 但没有

目标文件lib.cc.o已成功编译并存在。但没有 smcxx_obj 文件夹,也没有 smcxx_obj.so 文件(这是预期的)。

是否可以解决此错误,例如通过告诉 Gradle 跳过对特定 CMake 目标的此检查?

android gradle cmake
2个回答
4
投票

根据文档

Gradle 构建您在 CMake(或 ndk-build)项目中定义的所有可执行文件和共享对象库。

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

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

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

0
投票

参考修复:在Android上编译错误

Expected output file at .../libpng16d.so for target png but there was none
,解决方案是:

不要在

com.android.tools.build:gradle:7.3.1
中使用
/android/build.gradle
,只需使用
com.android.tools.build:gradle:7.4.1
或根据https://developer.android.com/studio/releases/gradle-plugin#cmake-imported-targets

的其他版本
© www.soinside.com 2019 - 2024. All rights reserved.