使用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
解决提示
精准区分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()正确禁用主机标志传递(替代废弃选项)
CMake 3.18+已将CUDA_PROPAGATE_HOST_FLAGS改为目标属性,而非全局变量,直接给目标设置该属性即可:set_target_properties(${project} PROPERTIES CUDA_PROPAGATE_HOST_FLAGS OFF)统一CUDA的C++标准
为CUDA目标单独设置C++标准,避免与CXX标准冲突:set_target_properties(${project} PROPERTIES CXX_STANDARD 17 CUDA_STANDARD 17 )
内容的提问来源于stack exchange,提问作者SebK
相关产品推荐
相关产品推荐

