【问题标题】:Visual Studio Community 2017 cl.exeVisual Studio 社区 2017 cl.exe
【发布时间】:2023-04-08 20:50:02
【问题描述】:

我正在 Windows 系统上编译一些 CUDA 内核。据我了解,nvcc 编译器需要使用cl.exe 在 Windows 系统上进行编译。获得此功能的主要方法是使用 Visual Studio。因此我安装了free community edition。之后,我预计VC 目录中会有bin 目录,如this onethis one 等多个其他问题所示。然而,我需要深入几层才能找到

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64\cl.exe

这个特定项目旨在制作一个可以在多个不同 Windows 系统上编译和使用的程序。我真的需要期待cl.exe 文件是这样嵌套的还是我错过了某种安装步骤?我期待一条更短的路径:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\bin\

最终,我需要一种尽可能简单的方法让用户能够让他们的环境找到 cl.exe 文件。通常,这涉及(在最高级别)设置环境变量。

【问题讨论】:

    标签: visual-studio


    【解决方案1】:

    我在不同的上下文(Elixir/Phoenix、Rust)中遇到了这个问题,但根本原因是相同的:编译期间找不到cl.exe

    我的设置是:

    • Windows 10,x64
    • Visual Studio Community 2017 已安装,但仅用于 C# 开发

    由于某种原因,安装Visual C++ Build Tools(如@cozzamara 建议)的解决方案不起作用。在安装过程中停止并显示一些晦涩的错误消息。猜它不喜欢我现有的 Visual Studio 安装。

    我就是这样解决的:

    1. 启动 Visual Studio 安装程序
    2. 查看Desktop development with C++(截图here
    3. 编译前执行以下命令:

      C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat
      

      从此命令cl.exe 有效。 或者(更方便开发)启动应用程序“Developer Command Prompt for VS 2017”或“x64 Native Tools Command Prompt VS 2017”。

    【讨论】:

    • 感谢您的回答。我的设置与您的相同,我遇到了同样的问题。您的解决方案奏效了!
    • 我通过 choco 只安装了构建工具,没有可视化 c++:choco install microsoft-build-tools。然后我调用 vs 2017 的开发人员命令提示符和 ... buff .. no cl.
    【解决方案2】:

    寻找VCVARSALL.BAT——这通常是一个更高的级别。如果你运行它,它会设置你的环境,这样你就可以在没有路径的情况下调用 CL。

    此处的文档:https://msdn.microsoft.com/en-us/library/f2ccy3wt.aspx

    【讨论】:

      【解决方案3】:

      我尝试了 Theo 的配置 Visual Studio 的解决方案,但这对我不起作用。我在 Windows 10 CUDA Toolkit 10.0 上运行 Visual Studio Community 2017。准确地说,我去了C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build,然后跑了vcvarsamd64_x86.bat。我的 PyCUDA 仍然无法编译,因为找不到 cl.exe

      我最终在 Visual Studio 2017 上创建了一个测试 CUDA 项目(“文件”-->“新项目”)并在左侧选择适当的 CUDA。

      然后我构建(Ctrl+Shift+B 或转到“构建”-->“构建解决方案”)显示的示例(这是一个简单的向量添加,复制如下)。

      #include "cuda_runtime.h"
      #include "device_launch_parameters.h"
      
      #include <stdio.h>
      
      cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);
      
      __global__ void addKernel(int *c, const int *a, const int *b)
      {
          int i = threadIdx.x;
          c[i] = a[i] + b[i];
      }
      
      int main()
      {
          const int arraySize = 5;
          const int a[arraySize] = { 1, 2, 3, 4, 5 };
          const int b[arraySize] = { 10, 20, 30, 40, 50 };
          int c[arraySize] = { 0 };
      
          // Add vectors in parallel.
          cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);
          if (cudaStatus != cudaSuccess) {
              fprintf(stderr, "addWithCuda failed!");
              return 1;
          }
      
          printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n",
              c[0], c[1], c[2], c[3], c[4]);
      
          // cudaDeviceReset must be called before exiting in order for profiling and
          // tracing tools such as Nsight and Visual Profiler to show complete traces.
          cudaStatus = cudaDeviceReset();
          if (cudaStatus != cudaSuccess) {
              fprintf(stderr, "cudaDeviceReset failed!");
              return 1;
          }
      
          return 0;
      }
      
      // Helper function for using CUDA to add vectors in parallel.
      cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size)
      {
          int *dev_a = 0;
          int *dev_b = 0;
          int *dev_c = 0;
          cudaError_t cudaStatus;
      
          // Choose which GPU to run on, change this on a multi-GPU system.
          cudaStatus = cudaSetDevice(0);
          if (cudaStatus != cudaSuccess) {
              fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");
              goto Error;
          }
      
          // Allocate GPU buffers for three vectors (two input, one output)    .
          cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
          if (cudaStatus != cudaSuccess) {
              fprintf(stderr, "cudaMalloc failed!");
              goto Error;
          }
      
          cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
          if (cudaStatus != cudaSuccess) {
              fprintf(stderr, "cudaMalloc failed!");
              goto Error;
          }
      
          cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
          if (cudaStatus != cudaSuccess) {
              fprintf(stderr, "cudaMalloc failed!");
              goto Error;
          }
      
          // Copy input vectors from host memory to GPU buffers.
          cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
          if (cudaStatus != cudaSuccess) {
              fprintf(stderr, "cudaMemcpy failed!");
              goto Error;
          }
      
          cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
          if (cudaStatus != cudaSuccess) {
              fprintf(stderr, "cudaMemcpy failed!");
              goto Error;
          }
      
          // Launch a kernel on the GPU with one thread for each element.
          addKernel<<<1, size>>>(dev_c, dev_a, dev_b);
      
          // Check for any errors launching the kernel
          cudaStatus = cudaGetLastError();
          if (cudaStatus != cudaSuccess) {
              fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus));
              goto Error;
          }
      
          // cudaDeviceSynchronize waits for the kernel to finish, and returns
          // any errors encountered during the launch.
          cudaStatus = cudaDeviceSynchronize();
          if (cudaStatus != cudaSuccess) {
              fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);
              goto Error;
          }
      
          // Copy output vector from GPU buffer to host memory.
          cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
          if (cudaStatus != cudaSuccess) {
              fprintf(stderr, "cudaMemcpy failed!");
              goto Error;
          }
      
      Error:
          cudaFree(dev_c);
          cudaFree(dev_a);
          cudaFree(dev_b);
      
          return cudaStatus;
      }
      

      此构建成功后,我查看了用于运行构建的命令,其中包含以下路径:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64。我将它添加到环境变量 PATH 中,现在我的 PyCUDA 可以工作了! (当我访问那条路径时,我发现了一个cl.exe

      TL;DR

      使用 Visual Studio 创建和构建 CUDA 项目。构建它。成功后,查看构建命令并将路径从那里复制到 PATH。

      【讨论】:

      • 这就是解决方案。经过一个小时的搜索,运行随机 .bat 文件并安装扩展,添加 C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64 将 CL.exe 添加到我的专业路径中。
      • 很多关于 SO 和互联网的答案都说不要在 PATH 中添加任何 VS,但没有其他任何东西对我有用。 VS 2019,我加了C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.23.28105\bin\Hostx64\x64,效果很好
      【解决方案4】:

      我遇到了类似的问题,Visual Studio 2017 找不到 x64 配置的 CL.exe 或 MIDL.exe。从 VS 命令提示符可以找到那里的文件,但在从 Visual Studio 构建时找不到(但它确实适用于 x86)。

      当我将生成输出的详细程度打开到诊断(工具 => 选项 => 项目和解决方案 => 生成和运行 => MSBuild 项目生成输出详细程度)时,我确实注意到 PATH 在x64 的“SetEnv”构建步骤。但是我尝试了多少重新安装 Visual Studio、单个组件、sdk、运行时、注册表清理等,都没有解决它(我几乎要重新安装 Windows)。

      然后我发现 Visual Studio C++ 项目可能会从您的应用数据文件夹中导入“user.props”文件;这是项目文件中的这一部分:

      <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
         <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
      </ImportGroup>
      

      $(UserRootDir) 在我的 PC 上评估为 C:\Users[username]\AppData\Local\Microsoft\MSBuild\v4.0,我在其中找到了 Microsofr.Cpp.xxx.user.props 文件。正是这些文件具有旧路径(早期安装和其他工具的遗留物)。

      所以我的解决方案是删除我的 AppData 文件夹中的这些道具文件。

      【讨论】:

        【解决方案5】:

        我不知道为什么,但路径似乎没有更新。 尝试从“Visual Studio 2017 的开发人员命令提示符”运行您的命令。

        【讨论】:

          猜你喜欢
          • 2017-08-27
          • 1970-01-01
          • 2017-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多