Gradle在构建包含OBJECT库的CMake项目时失败,因为它期望一个输出文件。

3

我的 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 目标检查来解决?

遇到了完全相同的问题。你有找到解决方法吗?除了从CMakeLists.txt中删除对象库目标之外,你还有其他的解决办法吗? - Ivano.Bilenchi
@Ivano.Bilenchi 我已经在cmake中将对象库作为目标删除,并直接使用其他库(静态+共享)中的对象文件,而不是对象库目标。但这并不是解决最初问题的方法。 - cytrinox
你的评论提醒了我,实际上我找到了一个不错的解决方法。我已经将其添加为答案。 - Ivano.Bilenchi
1个回答

4
根据文档
Gradle会构建您在CMake(或ndk-build)项目中定义的所有可执行文件和共享对象库。
但是,CMake对象库似乎根本没有得到支持,这导致了您遇到的问题。实际上,我认为这是一个错误:Gradle应该跳过构建它们,因为它们大多只在CMake内部有用。
无论如何,您可以通过手动指定要让Gradle构建哪些CMake目标来解决此问题(例如,仅省略对象库目标即可解决问题)。
android {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      ...
      cmake {
        targets "target1", "target2"
      }
    }
  }

似乎更好,因为不需要修改cmake文件。 - cytrinox
起初我不想相信这属于"defaultConfig"。结果证明我错了:https://cmake.org/pipermail/cmake/2017-August/066146.html - TomTasche
2
如果例如“target1”依赖于OBJECT库,则此解决方案无法正常工作。 “target1”仍然可以是共享库或可执行文件。 - DoDo
我尝试过了,但对我没有用。 - BrunoLevy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接