【发布时间】:2019-07-18 20:22:30
【问题描述】:
我有这个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 时出现错误。
ninja:错误:'library.so','execute' 需要,丢失并且没有已知的规则来制作它
或者您对如何做到这一点有什么建议?
我认为 Ninja 的要求是“library.so”必须首先存在,但 CMake 不同。它在运行时检查库是否存在。
【问题讨论】:
-
"It was a
add_custom_command(TARGET POST_BUILD...)" - 此命令的目标的名称是什么? (省略号中的第一个参数)。 -
add_library (somethingInterface empty.cpp) add_custom_command(TARGET somethingInterface POST_BUILD COMMAND ... #creating the "library" in the CMakeLists.txt ) 它只会构建一次。
-
目标名称是somethingInterface,也是add_library(somethingInterfacer empty.cpp)的目标
-
好的,您之前的评论只有在我重新打开页面后才会显示更新。这就是为什么我再次要求澄清。
-
是的,它应该使用目标级别的依赖项自动构建。但在 ninja 中,您可能需要将
library.so指定为创建它的命令的 BYPRODUCTS。有关此选项,请参阅 add_custom_command 的文档。
标签: cmake build-system ninja