CMake和忍者——”;缺少和没有已知的规则使其成为“;

CMake和忍者——”;缺少和没有已知的规则使其成为“;,cmake,build-system,ninja,Cmake,Build System,Ninja,我有这个档案: 导入的共享库将在文件Something.cmake中创建,但必须首先构建tt。 这是文件Something.cmake中的add_custom_命令(TARGET POST_BUILD…) 我在这里使用CMake构建没有任何问题,但是当我在那里使用时,会出现一个错误 忍者:错误:'library.so',需要'execute',缺少并且没有已知的规则来创建它 或者你对如何做到这一点有什么建议 我认为忍者有一个要求,“库。所以”必须首先存在,但它是不同的。它检查库在运行时是否存在。

我有这个档案:

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

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

忍者:错误:'library.so',需要'execute',缺少并且没有已知的规则来创建它

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


我认为忍者有一个要求,“库。所以”必须首先存在,但它是不同的。它检查库在运行时是否存在。

Make和Ninja处理导入目标的方式确实存在差异。对Make有效的东西,有时可能对忍者无效

特别是,以下代码行适用于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)
但这将与Make一起工作

您需要将库指定为
ExternalProject\u Add
comment as的副产品,因为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)
ExternalProject\u添加(extProject
GIT_存储库
CMAKE_缓存_参数”-
DCMAKE_INSTALL_PREFIX:STRING=${CMAKE_INSTALL_PREFIX}”
BUILD_BYPRODUCTS${CMAKE_INSTALL_PREFIX}/lib/libext.so
)
添加_库(extLib共享导入)
添加_依赖项(extLib extProject)
设置\u目标\u属性(extLib
导入的属性\u位置${CMAKE\u INSTALL\u PREFIX}/lib/libext.so
)
目标链接库(项目extLib)

“这是一个
添加自定义命令(目标后期构建…
”-此命令的目标名称是什么?(省略号中的第一个参数)。add_library(somethingInterface empty.cpp)add_custom_命令(TARGET somethingInterface POST_BUILD命令…#在CMakeLists.txt中创建“library”)将只生成一次。目标的名称是somethingInterface,也是add_库的目标(somethingInterfacer empty.cpp)好的,您以前的评论只有在我重新打开页面后才会显示和更新。这就是我再次要求澄清的原因。是的,它应该使用目标级别的依赖项自动生成。但是在ninja中,您可能需要指定
库。因此
作为创建它的命令的副产品。有关此选项,请参阅文档。(你不认为CMake是。如果是的话,它可能是由
lang CMake
)是的,在我的例子中,我添加了add_库(externalLib SHARED empty.cpp)只是为了向忍者添加依赖项。
ninja: error: '/path/to/libext.so', needed by 'project', missing and no known rule to make it
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)