6

在运行 Ninja 时,我在下面遇到了这个 ninja build 错误。我的 CMAKE 构建命令是cmake -G"Ninja" -DCMAKE_BUILD_TYPE=Release.

ninja: error: 'ext_deps/api/src/ext_api/build/src/lib/libapi.a', needed by 'Project', missing and no known rule to make it

假设我的项目包含一个 API(通过 CMAKE 从 GitHub 下载)和实现(项目)。

The layout would look like:
Project/
-- build/
-- cmake/modules
----- ExternalDep.cmake
----- FindAPI.cmake
-- CMakeLists.txt
-- src/
---- CMakeLists.txt
-- include/

假设在顶层CMakeLists.txt我做的是设置构建设置、CXX 标志等的常规业务,然后我调用include(ExternalDep),它检查“API”库是否在用户的系统中(如果没有,它是通过 CMAKE 下载的)。在src/CMakeLists.txt我尝试使用

target_link_libraries(${PROJECT_NAME} PRIVATE ${API_LIBRARY})

我遇到的第一个问题是,在“API”库甚至可以下载和构建之前,我收到了上面发布的 ninja build 错误。ExternalDep.cmake在我尝试添加项目可执行文件并链接到“API”库之前,我很肯定它已包含在内。

这是一个简化版本ExternalDep.cmake

  set(EXT_DEPS_PREFIX "ext_deps")

  ExternalProject_Add(ext_lib
    GIT_REPOSITORY "https://github.com/fake/api.git"
    GIT_TAG "master"
    PREFIX "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api"
    TMP_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api-tmp"
    STAMP_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api-stamp"
    CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
    SOURCE_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api"
    BINARY_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api-build"
    BUILD_ALWAYS true
    TEST_COMMAND "")

  add_dependencies(ext_projects ext_api)

  set(API_LIBRARY "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api-build/src/lib/libapi.a")
4

2 回答 2

13

我遇到了同样的问题,Ninja虽然它可以正常工作,我设法通过在我的块中添加一行来Unix Makefiles让它工作。例子:NinjaBUILD_BYPRODUCTSExternalProject_Add

    ExternalProject_Add(SDL2_PROJECT
        PREFIX 3rdparty
        URL https://www.libsdl.org/release/SDL2-2.0.5.tar.gz
        URL_MD5 d4055424d556b4a908aa76fad63abd3c
        CONFIGURE_COMMAND <SOURCE_DIR>/configure ${SDL2_configure_args} --prefix=<INSTALL_DIR> --disable-shared
        INSTALL_COMMAND make install -j9
        BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libSDL2.a
    )
    ExternalProject_Get_Property(SDL2_PROJECT INSTALL_DIR)
    set(SDL2_INSTALL_DIR ${INSTALL_DIR})
    add_library(SDL2_LIBRARY STATIC IMPORTED GLOBAL)
    set_property(TARGET SDL2_LIBRARY PROPERTY IMPORTED_LOCATION ${SDL2_INSTALL_DIR}/lib/libSDL2.a)
    add_dependencies(SDL2_LIBRARY SDL2_PROJECT)
于 2017-05-01T05:01:44.723 回答
-1

我能够通过生成 Unix Makefiles 而不是 Ninja 来解决这个问题。我仍然不确定这是否是单一问题,但这绝对是问题之一。

于 2016-10-31T22:01:25.267 回答