You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:47:32