【问题标题】:Fetch and build libpng-android from CMake从 CMake 获取并构建 libpng-android
【发布时间】:2020-11-08 12:22:22
【问题描述】:

我正在为 Android 开发一个 C++ 库,并且我依赖 libpng。我正在为 Android https://github.com/julienr/libpng-android.git 使用修改后的库,它有一个 build.sh 文件,以便针对不同的架构进行编译。或者可以使用 ndk-build 进行编译。

我正在使用 FetchContent 从 CMake 获取库,这可以有效地下载源文件,但无法正确构建。我正在设置BUILD_COMMAND,但它不起作用。

FetchContent_Declare( png
        GIT_REPOSITORY      https://github.com/julienr/libpng-android.git
        GIT_TAG             master
        UPDATE_DISCONNECTED TRUE
        STEP_TARGETS        update
        BUILD_COMMAND       "${NDK_PATH}/ndk-build.cmd NDK_PROJECT_PATH=${png_SOURCE_DIR}"

FetchContent_GetProperties(png)
if (NOT png_POPULATED)
    FetchContent_Populate(png)
    add_subdirectory("${png_SOURCE_DIR}" "${png_BINARY_DIR}" EXCLUDE_FROM_ALL)
endif()

看来BUILD_COMMAND 什么都不做。

那么,如何从 CMake 获取并构建 libpng-android,然后将该结果作为导入库导入?

【问题讨论】:

  • 函数FetchContent_Declare用于立即下载子项目的源代码(在配置阶段),因此可以配置构建 作为主项目的一部分,通过add_subdirectory。您可能会将FetchContent_DeclareExternalProject_Add 函数混淆,后者执行子项目的所有步骤:下载、配置、构建,但仅在主项目的构建 阶段执行。如果您想在主项目的配置阶段执行所有这些步骤,只需使用execute_process 命令。

标签: android c++ android-studio cmake libpng


【解决方案1】:

根据文档完成 Tsyvarev 评论并附上参考文献...

以下选项被明确禁止(它们被 FetchContent_Populate() 命令):

  • CONFIGURE_COMMAND
  • BUILD_COMMAND
  • INSTALL_COMMAND
  • TEST_COMMAND

ref:https://cmake.org/cmake/help/latest/module/FetchContent.html#command:fetchcontent_getproperties(就是上一段)

【讨论】:

    【解决方案2】:

    感谢@Tsyvarev 和@Mizux,我可以按照正确的方式去做。

    FetchContent_Declare( libpng
            GIT_REPOSITORY      https://github.com/julienr/libpng-android.git
            GIT_TAG             master
            UPDATE_DISCONNECTED TRUE
            STEP_TARGETS        update)
    
    FetchContent_GetProperties(libpng)
    if (NOT libpng_POPULATED)
        FetchContent_Populate(libpng)
        add_subdirectory("${libpng_SOURCE_DIR}" ${libpng_BINARY_DIR} EXCLUDE_FROM_ALL)
    endif()
    
    exec_program("${CMAKE_ANDROID_NDK}/ndk-build.cmd"
            ${libpng_BINARY_DIR}
            ARGS NDK_PROJECT_PATH=${libpng_SOURCE_DIR} APP_ABI=${ANDROID_ABI})
    

    然后链接库

    target_link_libraries( project
            PRIVATE
                ${libpng_SOURCE_DIR}/obj/local/${ANDROID_ABI}/libpng.a
            )
    

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 2015-09-22
      相关资源
      最近更新 更多