CMake依赖项自定义命令需在构建前执行的问题求助
解决CMake依赖库自定义命令执行顺序问题(Windows VS2017环境)
针对你遇到的Lib A与Lib B并行编译导致生成头文件缺失的问题,可以通过以下几种方式解决:
显式绑定生成文件与库目标
确保Lib B的add_custom_command生成的output_b.h被明确加入Lib B的源文件列表,让CMake将生成命令与Lib B的构建过程强绑定。示例代码如下:# LibB的CMakeLists.txt add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/output_b.h COMMAND your_code_generator_exe ARGS --input input_b.txt --output ${CMAKE_CURRENT_BINARY_DIR}/output_b.h MAIN_DEPENDENCY input_b.txt COMMENT "Generating output_b.h for LibB" ) add_library(LibB STATIC src/libb.cpp ${CMAKE_CURRENT_BINARY_DIR}/output_b.h ) # 暴露头文件目录给依赖LibB的目标 target_include_directories(LibB PUBLIC ${CMAKE_CURRENT_BINARY_DIR})这样CMake会保证
output_b.h生成完成后才开始编译LibB,而依赖LibB的LibA会等待LibB构建完成后再启动编译。强制目标间的依赖顺序
虽然target_link_libraries通常会处理依赖关系,但旧版本CMake(如3.16)在VS环境下可能存在并行编译的依赖漏洞。可以显式添加add_dependencies命令,确保LibA必须等LibB构建完成后再执行:# LibA的CMakeLists.txt add_library(LibA STATIC src/liba.cpp) target_link_libraries(LibA PRIVATE LibB) add_dependencies(LibA LibB)临时禁用VS并行编译
如果上述方法无效,可以暂时关闭VS的多处理器编译功能,强制按顺序执行构建。通过CMake设置:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP0")或者在VS项目属性中手动关闭“C/C++ -> 常规 -> 多处理器编译”。这种方法会降低编译速度,建议作为最后手段。
升级CMake版本
CMake 3.16版本较旧,后续版本(如3.20及以上)修复了大量VS环境下的依赖处理问题,升级CMake版本可能直接解决该问题。
内容的提问来源于stack exchange,提问作者Imunar
相关产品推荐
相关产品推荐

