CMake 和 Ninja - “缺少并且没有已知的规则来制作它”

Rox*_*les 5 cmake build-system ninja

我有这个CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.8)

include(${CMAKE_CURRENT_SOURCE_DIR}/src/Something.cmake)

add_executable(execute main.cpp)
add_dependencies(somethingInterface Something)
add_dependencies(execute somethingInterface)

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    )
target_compile_options(execute
    PRIVATE
        -std=c++11
        -g
)

add_library(library SHARED IMPORTED)
set_target_properties(library PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/library.so)
target_link_libraries(execute
    PRIVATE
        library
)
Run Code Online (Sandbox Code Playgroud)

共享导入的库将在文件Some.cmake 中创建,但必须先构建 tt。这是在文件中的add_custom_command(TARGET POST_BUILD ...)Something.cmake

我在这里使用 CMake 构建没有任何问题,但是当我使用Ninja 时出现错误

忍者:错误:“library.so”,“执行”需要,缺少并且没有已知的规则来制作它

或者你对如何做到这一点有什么建议?

我认为 Ninja 有一个要求,即“library.so”必须首先存在,但 CMake 是不同的。它在运行时检查库是否存在。

Car*_*rra 5

Make 和 Ninja 处理导入目标的方式确实存在分歧。对 Make 有用的东西,有时可能不适用于 Ninja。

特别是,以下代码行适用于 Make,但不适用于 Ninja:

ExternalProject_Add(extProject
    GIT_REPOSITORY <GIT_URL>
    CMAKE_CACHE_ARGS "-
    DCMAKE_INSTALL_PREFIX:STRING=${CMAKE_INSTALL_PREFIX}"
)
add_library(extLib SHARED IMPORTED)
add_dependencies(extLib extProject)
set_target_properties(extLib
    PROPERTIES IMPORTED_LOCATION ${CMAKE_INSTALL_PREFIX}/lib/libext.so
)

target_link_libraries(project extLib)
Run Code Online (Sandbox Code Playgroud)

CMake 配置步骤可以正常工作,但在构建时 Ninja 会抱怨:

ninja: error: '/path/to/libext.so', needed by 'project', missing and no known rule to make it
Run Code Online (Sandbox Code Playgroud)

但这与 Make配合得很好

您需要将库指定为Tsyvarev 提到的注释的副产品,因为 ExternalProject 在构建时运行。ExternalProject_Add

以下对我来说很好用:

ExternalProject_Add(extProject
    GIT_REPOSITORY <GIT_URL>
    CMAKE_CACHE_ARGS "-
    DCMAKE_INSTALL_PREFIX:STRING=${CMAKE_INSTALL_PREFIX}"
    BUILD_BYPRODUCTS ${CMAKE_INSTALL_PREFIX}/lib/libext.so
)
add_library(extLib SHARED IMPORTED)
add_dependencies(extLib extProject)
set_target_properties(extLib
    PROPERTIES IMPORTED_LOCATION ${CMAKE_INSTALL_PREFIX}/lib/libext.so
)

target_link_libraries(project extLib)
Run Code Online (Sandbox Code Playgroud)