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

使用CMake 3.26.4+CUDA 12.1+VS编译.cu文件遇nvcc致命错误求助

问题:NVCC编译.cu文件时出现"A single input file is required..."错误

编译环境:CMake 3.26.4、CUDA v12.1、Visual Studio 16.11.25

错误信息

1>nvcc fatal   : A single input file is required for a non-link phase when an outputfile is specified

相关CMake配置

enable_language(CUDA)

add_library(${project} SHARED)

set_target_properties(${project} PROPERTIES CXX_STANDARD 17)

if (MSVC)
  target_compile_definitions(${project} PUBLIC -DBOOST_ASIO_DISABLE_CONCEPTS)
  target_compile_options(${project} PRIVATE /std:c++latest /await:strict /bigobj "/Zc:__cplusplus")
endif()

find_package(CUDAToolkit)

set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -arch=sm_60")

target_link_libraries(${project} PRIVATE CUDA::cuda_driver)

set_property(TARGET ${project} PROPERTY CUDA_SEPARABLE_COMPILATION ON)

已尝试的无效方法

  • 设置set(CUDA_PROPAGATE_HOST_FLAGS FALSE),该选项可能已废弃
  • 移除target_compile_options,改用带有$<$<COMPILE_LANGUAGE:CXX>的add_compile_options

解决提示

  1. 精准区分CXX与CUDA的编译选项
    将原有的target_compile_options修改为仅针对CXX语言添加MSVC专属选项,避免NVCC接收到不识别的Windows风格参数:

    if (MSVC)
      target_compile_definitions(${project} PUBLIC -DBOOST_ASIO_DISABLE_CONCEPTS)
      target_compile_options(${project} PRIVATE
        $<$<COMPILE_LANGUAGE:CXX>: /std:c++latest /await:strict /bigobj "/Zc:__cplusplus">
      )
    endif()
    
  2. 正确禁用主机标志传递(替代废弃选项)
    CMake 3.18+已将CUDA_PROPAGATE_HOST_FLAGS改为目标属性,而非全局变量,直接给目标设置该属性即可:

    set_target_properties(${project} PROPERTIES CUDA_PROPAGATE_HOST_FLAGS OFF)
    
  3. 统一CUDA的C++标准
    为CUDA目标单独设置C++标准,避免与CXX标准冲突:

    set_target_properties(${project} PROPERTIES
      CXX_STANDARD 17
      CUDA_STANDARD 17
    )
    

内容的提问来源于stack exchange,提问作者SebK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:48:32