CMake自定义目标依赖异常:修改Rust目标B未触发A编译
解决CMake中Rust目标B更新不触发目标A编译的问题
问题根源
你的CMake配置里,add_dependencies(A B)仅保证B在A之前构建,但CMake不会因为B的输出文件变化而自动触发A的构建——因为A的自定义目标仅依赖自身输出binary_A,而binary_A的生成命令没有关联到binary_B的变化。当B的源码修改后,CMake只会重新构建B生成binary_B,但判定binary_A没有过时,因此不会触发A的编译。
可行解决方案
方案1:让A的构建命令依赖B的输出文件
修改生成binary_A的add_custom_command,添加DEPENDS参数指向binary_B,让CMake追踪到binary_B的变化,从而触发A的重新构建:
project(demo) # 配置Rust目标B add_custom_command( OUTPUT binary_B COMMAND cargo build --package crate_B --release WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/path/to/crate_B ) add_custom_target(B DEPENDS binary_B) # 配置Rust目标A,添加对binary_B的依赖 add_custom_command( OUTPUT binary_A COMMAND cargo build --package crate_A --release DEPENDS binary_B # 关键:让A的构建命令依赖B的输出 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/path/to/crate_A ) add_custom_target(A DEPENDS binary_A) # 配置C++目标C add_executable(C ...) # 保持原有的依赖顺序控制 add_dependencies(A C)
方案2:直接让A的自定义目标关联B的输出文件
如果方案1不适用,可以直接将binary_B加入A的自定义目标依赖,同时确保binary_B的路径被CMake正确识别:
# 省略其他配置... add_custom_target(A DEPENDS binary_A binary_B)
注意:如果此方案之前无效,检查
binary_B的路径是否为CMake可识别的绝对路径或相对路径(建议使用CMAKE_CURRENT_BINARY_DIR等变量拼接绝对路径)。
额外提示(若Rust crate本身有依赖)
如果crate A本身在Cargo.toml中依赖crate B,那无需在CMake中额外配置依赖——直接调用cargo build时,cargo会自动处理crate间的依赖,此时只需要确保CMake的自定义命令能正确触发cargo的增量编译即可。
内容的提问来源于stack exchange,提问作者Changfeng
相关产品推荐
相关产品推荐

