错误 MSB3721 命令 已退出,返回代码为 1 CUDA 11.6.targets ***

文章讲述了开发者在Windows服务器上遇到CUDA编译错误MSB3721的问题,原因是CUDA版本不支持显卡的计算能力。通过命令行获取详细报错和检查GPU架构,最终确定升级CUDA版本11.8来解决问题。还提到了VisualStudio编译错误时的调试技巧和可能遇到的额外问题。
部署运行你感兴趣的模型镜像

总是遇到”错误 MSB3721 命令 已退出“这个错误,但是每次的原因都不一样,记录一下踩过的坑吧

error1:2023.12.15

错误背景:已经写好的C++工程在其他两台windows服务器上都编译通过了,但是给另外一位同事电脑配置后在visual stdio中生成解决方案一直报这个错,基本是新电脑,配置是:显卡(4090)、CUDA(11.7)。
完整报错:

严重性  代码  说明  项目  文件  行  禁止显示状态
错误  MSB3721  命令“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\bin\nvcc.exe"  
--use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64" 
-x cu -rdc=true  
-ID:\include 
-ID:\include\Common 
-ID:\include\tinyxml2 
-I"C:\Program Files\MATLAB\R2022a\extern\include" 
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include" 
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include"  -G   
--keep-dir x64\Debug  -maxrregcount=0  --machine 64 --compile -cudart static -std=c++17 -arch=native -Xcompiler="/EHsc -Zi -Ob0" -g  -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"" 
-Dfilter_EXPORTS 
-D_WINDLL 
-D_MBCS 
-DWIN32 
-D_WINDOWS 
-D"CMAKE_INTDIR=\"Debug\"" 
-Dfilter_EXPORTS -Xcompiler "/EHsc /W3 /nologo /Od /Fdfilter.dir\Debug\vc142.pdb /FS /Zi /RTC1 /MDd /GR" -o filter.dir\Debug\/src/filter.cu.obj "D:\src\filter.cu"”已退出,返回代码为 1。  
filter  C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 11.7.targets  790

这个报错基本看不出什么问题,使用命令行生成解决方案可以得到更细节的报错信息:

make --build .

然后在命令行中上面这个报错的前一行得到新的报错信息:

nvcc fatal : Unsupported gpu architecture 'compute_89'

发现是算力不匹配问题,首先查看当前CUDA版本支持的最高算例,使用命令:

nvcc --list-gpu-arch
E:\***>nvcc --list-gpu-arch
compute_35
compute_37
compute_50
compute_52
compute_53
compute_60
compute_61
compute_62
compute_70
compute_72
compute_75
compute_80
compute_86
compute_87

确实,CUDA11.7不支持compute_89,查看能够支持89的CUDA版本升级安装即可,这里我的4090显卡对应>=CUDA11.8
查询参照网站:进去直接搜索自己的显卡号找快一点
在这里插入图片描述
升级CUDA后报错消失。
tip:
Visual Stdio编译错误不清晰时,考虑用命令行编译。
参考文章:
https://zhuanlan.zhihu.com/p/646962555
https://blog.youkuaiyun.com/m0_37605642/article/details/99100924
https://blog.youkuaiyun.com/Redamancy06/article/details/125809903
重装cuda选择组件时,若已经取消选择visual stdio intergration,但安装时仍然会安装visual stdio intergration edition,并报错安装失败,则在选择安装选项时,同时取消掉Nsight VSE即可。

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think> 我们遇到了一个MSBuild错误MSB3073,发生在执行xcopy命令的生成后事件中。错误代码4表示“初始化错误,内存不足或命令行无效”。通常,这可能是由于路径问题或命令格式错误引起的。 ### 错误分析: 1. **命令文本**:`xcopy /Y /R "resources\*.*" ""` - 目标路径为空(`""`)是无效的 - 原因:`$(OutDir)`宏可能未正确展开,导致目标路径为空字符串 2. **常见原因**: - 项目配置中输出目录设置错误 - 宏的拼写错误(如`$(OutDir)`写成`$OutDir`等) - 路径包含特殊字符导致解析失败 ### 解决方案: #### 步骤1:检查生成后事件命令 ```bat :: 错误示例(目标路径为空) xcopy /Y /R "resources\*.*" "" :: 正确形式应包含目标路径 xcopy /Y /R "$(ProjectDir)resources\*.*" "$(OutDir)resources\" ``` #### 步骤2:验证宏的实际值 在生成后事件顶部添加调试输出: ```bat echo 项目目录: $(ProjectDir) echo 输出目录: $(OutDir) ``` #### 步骤3:使用完整路径和引号 ```bat :: 确保源路径和目标路径都使用宏和引号 xcopy /Y /R "$(ProjectDir)resources\*.*" "$(OutDir)resources\" ``` #### 步骤4:处理路径空格 即使路径无空格也建议加引号: ```bat xcopy /Y /R "$(ProjectDir)resources\*.*" "$(OutDir)" ``` #### 步骤5:替代方案(使用robocopy) 若xcopy持续失败,可改用robocopy(Windows Vista+): ```bat robocopy "$(ProjectDir)resources" "$(OutDir)resources" /E /NJH /NJS /NP /NDL ``` ### 完整修复示例: ```bat :: 生成后事件 - 复制资源文件夹 set sourceDir=$(ProjectDir)resources set targetDir=$(OutDir)resources :: 创建目标目录(防止不存在) if not exist "%targetDir%" mkdir "%targetDir%" :: 执行复制(带错误控制) xcopy /Y /R /E /I "%sourceDir%\*.*" "%targetDir%" ``` ### 错误处理增强: ```bat :: 添加错误级别检查 xcopy /Y /R /E /I "$(ProjectDir)resources\*.*" "$(OutDir)resources\" if errorlevel 1 ( echo 错误: 资源复制失败,代码 %errorlevel% exit /b 1 ) else ( echo 资源复制成功 ) ``` ### 调试技巧: 1. 在VS中查看宏实际值: - 打开项目属性 → 生成事件 → 编辑生成后事件 - 点击右下角"宏"按钮查看所有宏当前值 2. 临时修改事件输出日志: ```bat :: 将命令输出重定向到文件 ( echo 开始复制资源... xcopy /Y /R "$(ProjectDir)resources\*.*" "$(OutDir)resources\" echo 复制完成,错误级别=%errorlevel% ) > "$(OutDir)post_build_log.txt" ``` ### 特殊场景处理: **当`$(OutDir)`包含尾随反斜杠时** ```bat :: 确保路径格式统一 set target=$(OutDir) if "%target:~-1%"=="\" set target="%target:~0,-1%" xcopy /Y /R "resources\*.*" "%target%\resources\" ``` --- ### §§相关问题§§: 1. 如何在Visual Studio中调试生成后事件执行的批处理命令? 2. 除了xcopy和robocopy,还有哪些方法可以在生成后事件中可靠地复制文件? 3. 当项目输出目录被多个项目共享时,如何避免生成后事件中的文件冲突? 4. 如何为不同的构建配置(Debug/Release)设置不同的生成后事件行为? </think> ### 生成后事件命令错误分析及解决方案 #### 错误原因分析: 1. **错误代码4的含义**: - Xcopy退出代码4表示"初始化错误:内存不足或命令行无效" - 主要原因是目标路径为空(`""`),这在文件操作中是无效路径 2. **根本问题**: ```bat xcopy /Y /R "resources\*.*" "" ``` - 目标路径参数为空字符串 `""`,导致xcopy无法确定复制目标 - 通常是因为路径宏(如`$(OutDir)`)未正确解析或项目配置错误 3. **潜在原因**: - 路径宏未正确定义(如`$(OutDir)`为空) - 项目配置中输出目录设置错误 - 路径包含特殊字符导致解析失败 - 权限问题导致无法创建目标目录 #### 完整解决方案: ##### 步骤1:验证并修复路径宏 ```bat :: 在生成后事件中添加调试输出 echo 项目目录: $(ProjectDir) echo 输出目录: $(OutDir) echo 配置: $(Configuration) echo 平台: $(Platform) :: 使用路径前验证目录存在 if not exist "$(OutDir)" mkdir "$(OutDir)" ``` ##### 步骤2:修复xcopy命令 ```bat :: 正确格式(确保源和目标路径都有效) xcopy /Y /R /I /E "$(ProjectDir)resources\*.*" "$(OutDir)resources\" :: 替代方案:使用robocopy(更健壮) robocopy "$(ProjectDir)resources" "$(OutDir)resources" /E /NJH /NJS /NP /NDL ``` ##### 步骤3:处理路径分隔符问题 ```cpp // 在生成后事件前添加路径标准化步骤 :: 确保路径使用反斜杠 set ProjectDir=$(ProjectDir:\=/) set OutDir=$(OutDir:\=/) set ProjectDir=%ProjectDir:/=\% set OutDir=%OutDir:/=\% ``` ##### 步骤4:完整修复后的生成后事件 ```bat :: 生成后事件示例 - 安全复制资源 setlocal enabledelayedexpansion echo [DEBUG] 项目目录: $(ProjectDir) echo [DEBUG] 输出目录: $(OutDir) :: 创建目标目录(如果不存在) if not exist "$(OutDir)resources\" ( echo 创建资源目录... mkdir "$(OutDir)resources" ) :: 执行复制(带错误处理) echo 正在复制资源文件... xcopy /Y /R /I /E "$(ProjectDir)resources\*.*" "$(OutDir)resources\" if %errorlevel% neq 0 ( echo 错误: 资源复制失败! 错误代码: %errorlevel% exit /b 1 ) echo 资源复制成功完成! endlocal ``` #### 调试技巧: 1. **查看宏实际值**: - 在VS中:项目属性 → 生成事件 → 点击"宏"按钮 - 查看`$(OutDir)`的实际值 2. **测试命令**: ```bat :: 在cmd中手动测试(替换实际值) xcopy /Y /R "C:\你的项目路径\resources\*.*" "C:\输出路径\bin\Debug\" ``` 3. **常见问题排查**: - 检查项目配置是否匹配(Debug/Release, x86/x64) - 验证输出目录权限(是否有写入权限) - 检查路径是否包含中文/特殊字符 #### 替代方案:使用CMake实现复制 ```cmake # CMakeLists.txt 示例 add_executable(MyApp main.cpp) # 创建自定义复制命令 add_custom_command(TARGET MyApp POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/resources" "$<TARGET_FILE_DIR:MyApp>/resources" COMMENT "正在复制资源文件..." ) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值