CMake 和忍者 - "missing and no known rule to make it"
CMake and Ninja - "missing and no known rule to make it"
我有这个 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
)
共享导入的库将在文件Something.cmake中创建,但必须先构建tt。
它是文件 Something.cmake.
中的 add_custom_command(TARGET POST_BUILD...)
我在这里使用 CMake 构建没有任何问题,但是当我使用 Ninja 时出现 error.
ninja: error: 'library.so', needed by 'execute', missing and no known rule to make it
或者您对如何做到这一点有什么建议吗?
我觉得Ninja有个要求就是“library.so”必须先存在,但是CMake不一样。它在运行时检查库是否存在。
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)
CMake 配置步骤可以正常工作,但在构建时 Ninja 会报错:
ninja: error: '/path/to/libext.so', needed by 'project', missing and no known rule to make it
但这 很好 与 Make 一起使用。
您需要将库指定为 ExternalProject_Add
评论的 副产品 作为 ,因为 ExternalProject 在构建时运行。
以下对我来说很好用:
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)
我有这个 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
)
共享导入的库将在文件Something.cmake中创建,但必须先构建tt。 它是文件 Something.cmake.
中的 add_custom_command(TARGET POST_BUILD...)我在这里使用 CMake 构建没有任何问题,但是当我使用 Ninja 时出现 error.
ninja: error: 'library.so', needed by 'execute', missing and no known rule to make it
或者您对如何做到这一点有什么建议吗?
我觉得Ninja有个要求就是“library.so”必须先存在,但是CMake不一样。它在运行时检查库是否存在。
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)
CMake 配置步骤可以正常工作,但在构建时 Ninja 会报错:
ninja: error: '/path/to/libext.so', needed by 'project', missing and no known rule to make it
但这 很好 与 Make 一起使用。
您需要将库指定为 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)