【发布时间】:2021-12-03 20:47:36
【问题描述】:
我在项目源代码树的 imported 文件夹中有一个第 3 方(预构建)可执行文件(名为 other)。基本上,项目的结构是这样的:
.
├── CMakeLists.txt
├── imported
│ ├── libother.so
│ └── other
└── main.cpp
为了让我的应用程序正常运行,必须将 other 可执行文件复制到 my 可执行文件旁边,我使用此脚本实现的目的:
cmake_minimum_required(VERSION 3.21)
project(myproject)
add_executable(myexe main.cpp)
set(path_in ${CMAKE_SOURCE_DIR}/imported/other)
set(path_out ${CMAKE_BINARY_DIR}/other)
add_executable(other_i IMPORTED)
set_target_properties(other_i PROPERTIES IMPORTED_LOCATION ${path_in})
add_custom_command(OUTPUT ${path_out}
COMMAND ${CMAKE_COMMAND} -E copy ${path_in} ${path_out}
DEPENDS other_i
)
add_custom_target(other DEPENDS ${path_out})
add_dependencies(myexe other)
问题是每当在 Linux 上构建项目时,我都会从 gmake 收到奇怪的消息:
$ cmake -S . -B .build
...
$ cmake --build .build
gmake[2]: Circular CMakeFiles/other <- other dependency dropped.
gmake[2]: Circular other <- other dependency dropped.
虽然 other 被复制得很好,但只要我重新发出构建命令(即使没有任何更改),它总是被复制。这是不可取的,最困扰我的是它与 Windows 上的 MSVC 以及 Linux 上的共享库完美配合。例如。这工作正常:
cmake_minimum_required(VERSION 3.21)
project(myproject)
add_executable(myexe main.cpp)
set(path_in ${CMAKE_SOURCE_DIR}/imported/libother.so)
set(path_out ${CMAKE_BINARY_DIR}/libother.so)
add_library(other_i SHARED IMPORTED)
set_target_properties(other_i PROPERTIES IMPORTED_LOCATION ${path_in})
add_custom_command(OUTPUT ${path_out}
COMMAND ${CMAKE_COMMAND} -E copy ${path_in} ${path_out}
DEPENDS other_i
)
add_custom_target(other DEPENDS ${path_out})
add_dependencies(myexe other)
我对正在发生的事情束手无策。是CMAKE的错误还是我遗漏了什么? 任何见解将不胜感激。
PS:请不要建议在主要目标上使用 POST_BUILD,因为这种方法有其自身的缺点。
【问题讨论】:
-
DEPENDS other_i为什么要依赖库? -
@KamilCuk, 'DEPENDS other_i' - 这是对目标的依赖,不管它是什么
-
但是你依赖于文件,而不是目标
DEPENDS ${path_in}。该命令不关心目标。另外,buildingmyexe是否依赖于复制到二进制目录的库?对我来说,您应该像另一个自定义目标一样创建,这取决于正在构建的myexe和复制的库,这些是单独的不相关操作。 -
它应该:“如果参数是目标的名称(由 add_custom_target()、add_executable() 或 add_library() 命令创建),则创建目标级别的依赖项以确保使用此自定义命令在任何目标之前构建目标。” cmake.org/cmake/help/latest/command/add_custom_command.html
标签: cmake