【问题标题】:build cmake ExternalProject with gradle使用 gradle 构建 cmake ExternalProject
【发布时间】:2018-04-12 01:28:43
【问题描述】:

我正在尝试将现有的本机库用作 android 项目的一部分。我按照有关将 C 和 C++ 代码添加到 android studio 项目的说明进行操作。我已经到了我有一个正常工作的 CMakeLists.txt 文件(独立测试)的地步,我已经指示 gradle 使用它来编译本机代码。

我使用的库使用 make,所以我使用 ExternalProject_Add 来指示 cmake 如何编译它。以下是相关代码:

ExternalProject_Add(foo
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../libfoo
    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../libfoo/configure
        --host=arm-linux-androideabi
    BUILD_COMMAND ${MAKE}
    INSTALL_COMMAND true)

这是模块的 build.gradle 的相关部分:

externalNativeBuild {
    cmake {
        path '../cpp/CMakeLists.txt'
    }
}

当我运行./gradlew assembleDebug 时,外部项目没有被编译。在 cmake 中添加依赖于foo 的可执行文件(名为bar)后,配置步骤运行但构建步骤不运行。我修改了库的代码,所以编译会失败,但 gradle 无论如何都会返回成功)。

这是./gradlew assembleDebug 在这些更改之后输出的最后几行。

configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
[6/10] Performing build step for 'foo'
[7/10] Performing install step for 'foo'
[8/10] Completed 'foo'
[9/10] Building C object CMakeFiles/bar.dir/bar.c.o
[10/10] Linking C executable bar

BUILD SUCCESSFUL in 18s

任何想法发生了什么?我做错了什么?

我正在使用 gradle 4.1 和 cmake 3.6。

【问题讨论】:

  • 您可以将LOG_BUILD ON 添加到您的 ExternalProject_Add 吗?您是否也将构建的结果包装在导入的目标中以在bar 中使用它?

标签: gradle cmake


【解决方案1】:

你应该使用BUILD_IN_SOURCE ON 否则你的BINARY_DIR 在其他地方所以make 恕我直言什么也不做。

【讨论】:

  • 谢谢,这就是构建时没有发生任何事情的原因。但是我仍然需要虚构的可执行文件bar 来让 gradle 为外部目标执行这些步骤。
【解决方案2】:

https://stackoverflow.com/a/47636956/192373。您不需要虚构的可执行文件。不过,您确实需要两个单独的目标。

add_library(foolib SHARED IMPORTED)
add_dependencies(foolib foo)
set_target_properties(foolib IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../libfoo/…/libfoo.so)

您不一定需要BUILD_IN_SOURCE ON,最好将BINARY_DIR 设置在build/intermediates 的某个位置,并将其传递给make

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多