CMake的add_custom_command在Windows与Linux下输出路径是否有差异?
问题分析与解决
核心问题
你的警告本质是文件名大小写不匹配,以及CMake自定义命令的输出路径逻辑在Windows下的严格性导致的:
- 你在
add_custom_command的OUTPUT字段指定的是vectorAddMMAP_kernel.fatbin(驼峰命名) - 但警告信息里显示实际期望的输出文件是
vectoraddmmap_kernel.fatbin(全小写)
Windows文件系统不区分大小写,但MSBuild和CMake的增量构建检查是区分大小写的,所以即使文件实际生成了,CMake也会判定“文件不存在”。
另外,Linux和Windows下CMake的路径解析存在细微差异:
- Linux下路径大小写严格,你指定的文件名和生成的文件名一致,因此构建正常
- Windows下MSBuild可能自动将目标文件名转为小写,或命令执行时的路径解析导致文件名大小写变化,引发匹配失败。
修复步骤
1. 统一文件名大小写
确保OUTPUT字段和-o参数中的文件名完全一致,比如都使用驼峰命名:
add_custom_command( OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/vectorAddMMAP_kernel.fatbin COMMAND ${CMAKE_CUDA_COMPILER} -fatbin ${CCBIN_ARGUMENT} --generate-code arch=compute_${CMAKE_CUDA_ARCHITECTURES},code=sm_${CMAKE_CUDA_ARCHITECTURES} -o ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/vectorAddMMAP_kernel.fatbin ${CMAKE_CURRENT_SOURCE_DIR}/modified_cuda_samples/vectorAddMMAP/vectorAdd_kernel.cu MAIN_DEPENDENCY modified_cuda_samples/vectorAddMMAP/vectorAdd_kernel.cu )
2. 明确输出路径为绝对路径
将OUTPUT改为绝对路径,和-o参数完全对应,避免CMake在不同平台下解析相对路径的差异:
- 之前使用相对路径
vectorAddMMAP_kernel.fatbin,CMake会默认在CMAKE_CURRENT_BINARY_DIR下查找,但你实际生成到CMAKE_RUNTIME_OUTPUT_DIRECTORY,两者可能不是同一个目录(比如Windows下的Debug/Release子目录) - 直接用绝对路径作为
OUTPUT,让CMake准确识别生成的文件位置。
3. 关联自定义命令到目标
确保vectorAddMMAP可执行目标依赖这个自定义命令的输出,否则CMake可能不会正确触发自定义命令的执行:
add_executable(vectorAddMMAP modified_cuda_samples/vectorAddMMAP/vectorAddMMAP.cpp) # 添加依赖,确保生成fatbin后再编译可执行文件 add_dependencies(vectorAddMMAP vectorAddMMAP_kernel.fatbin)
验证要点
- 构建后检查
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}下是否存在vectorAddMMAP_kernel.fatbin - 确认Windows下MSBuild的目标文件名大小写和你指定的完全一致
- 增量构建时,修改
.cu文件会重新触发fatbin的生成,且不再出现警告
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

