CUDA 11.6+VS2022+Windows10 官方示例代码无法编译,报错 msb3721,如何解决?

我参考了以下这些博客配置 CUDA,尝试的版本号包括 11.6, 11.7,11.8,但是均无法使 VS2022 正常编译,报错信息包含 msb3721。

捣鼓了也有好几晚上了,cuda toolkit 不同版本下载卸载也有好多次了,但是始终无法编译示例代码。

现在我按照以上的博客内容,配置了 windows10+vs2022+cuda11.6,下载了官方示例代码,并随意打开了一个文件 clock.cu,以下是报错信息:

img

以下是相关的环境变量配置

img


img

以下是相关命令测试

img


img


img

将 VisualStudio 的编译命令复制出来之后手动复制到 cmd 中运行,不显示任何额外信息,直接退出。

尝试用 nvcc 编译器编译一个 helloworld.cpp 程序,结果是

img

我不确定是不是由着引起的,但是我确实无法手动用命令编译。

感谢各位前来帮助!如果能帮我解决问题的话,我将无比感激!

我的问题最终解决了。
问题的核心就在于手动使用使用 nvcc 编译时产生的错误”Couldn't set environment for ...“。这个错误有两种可能的原因(也可能更多,但我没遇到过):

  1. Path 变量中,有空格的项没有加引号。
  2. Temp 或者 Tmp 变量指向的目录存在空格

我是第二种情况。这个解决方式实际上在 这篇 StackOverflow 问答 里已经提到了,但是我一开始没有往这个方向怀疑,所以没有尝试。

解决方法就是直接改 Temp 和 Tmp 变量,把它们改到一个没有空格的目录(加引号不行,因为 nvcc 会在这个目录里面的目录新建东西,加引号会阻止它访问里面的路径),然后删掉原先的目录。这个目录删了也问题不大,杀毒软件清理空间的时候也是直接删。

过段时间我会把我这几天艰辛的配置过程中遇到的三四个问题写成博客发出来,以供参考。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    这个问题可能是由多种原因引起的,以下是一些常见的解决方法:

    1. 确保已安装适当的NVIDIA驱动程序和CUDA版本,并且环境变量已正确设置。可以参考上述参考资料中的“CUDA的下载和安装”和“在Visual Studio中使用cuda编程”的部分来确保环境设置正确。

    2. 尝试重新安装VS2022,并确保选择了CUDA C++工作负载以及相关的C++开发人员工具。

    3. 可以尝试在VS的“选项 -> 项目和解决方案 -> 生成和运行 -> MSBuild输出详细信息”中选择“最详细的”来获取更多编译错误的信息。

    4. 尝试手动编译CUDA应用程序,可以将Visual Studio生成的编译命令手工拷贝到cmd中尝试执行。如果错误信息仍然过于简洁,可以尝试使用“nvcc”命令手工编译测试程序,以便更好地确定是否存在与Visual Studio集成相关的问题。

    以下是一些推荐的代码示例:

    示例1:检查CUDA和VS环境变量

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main(){
    
        char* cuda_path = getenv("CUDA_PATH");
        char* vs_path = getenv("VSINSTALLDIR");
    
        if(cuda_path != nullptr){
            cout<<"CUDA Path: "<<cuda_path<<endl;
        }else{
            cout<<"CUDA Path is not set"<<endl;
        }
    
        if(vs_path != nullptr){
            cout<<"VS Path: "<<vs_path<<endl;
        }else{
            cout<<"VS Path is not set"<<endl;
        }
    
        return 0;
    }
    

    示例2:手动编译CUDA应用程序

    #include <iostream>
    using namespace std;
    
    __global__ void helloworld()
    {
        printf("Hello World from GPU!\n");
    }
    
    int main()
    {
        helloworld<<<1,1>>>();
        cudaDeviceSynchronize();
        return 0;
    }
    

    命令行编译:

    nvcc helloworld.cu -o helloworld.exe
    

    如果编译成功,运行helloworld.exe应该会显示“Hello World from GPU!”的输出信息。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^