Visual Studio 社区 2017 cl.exe

Posted

技术标签:

【中文标题】Visual Studio 社区 2017 cl.exe【英文标题】:Visual Studio Community 2017 cl.exe 【发布时间】:2017-08-05 07:28:37 【问题描述】:

我正在 Windows 系统上编译一些 CUDA 内核。据我了解,nvcc 编译器需要使用cl.exe 在 Windows 系统上进行编译。获得此功能的主要方法是使用 Visual Studio。因此我安装了free community edition。之后,我预计VC 目录中会有bin 目录,如this one 和this 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 文件。通常,这涉及(在***别)设置环境变量。

【问题讨论】:

【参考方案1】:

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

我的设置是:

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

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

我就是这样解决的:

    启动 Visual Studio 安装程序 查看Desktop development with C++(截图here)

    编译前执行以下命令:

    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 的开发人员命令提示符”运行您的命令。

【讨论】:

以上是关于Visual Studio 社区 2017 cl.exe的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio Community 2017 cl 链接器不会链接 GTK3 库?

visual studio2017社区版如何空格操作?

错误:命令 'C:\\Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.14.26428\\bin\\HostX86\\x64\\cl.exe'

如何为 Visual Studio 构建工具 cl.exe 编写 makefile(nmake)

Visual Studio C++ 社区 2017 中的构建错误

从 Visual Studio 2017 社区升级到 Pro