Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio Visual Studio社区2017 cl.exe_Visual Studio - Fatal编程技术网

Visual studio Visual Studio社区2017 cl.exe

Visual studio Visual Studio社区2017 cl.exe,visual-studio,Visual Studio,我正在Windows系统上编译一些CUDA内核。据我所知,nvcc编译器需要使用cl.exe在Windows系统上编译。实现这一点的主要方法是使用VisualStudio。因此,我已安装了。在此之后,我希望在VC目录中会有bin目录,如和等多个其他问题所示。然而,我需要深入到几个层次去寻找 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64\

我正在Windows系统上编译一些CUDA内核。据我所知,
nvcc
编译器需要使用
cl.exe
在Windows系统上编译。实现这一点的主要方法是使用VisualStudio。因此,我已安装了。在此之后,我希望在
VC
目录中会有
bin
目录,如和等多个其他问题所示。然而,我需要深入到几个层次去寻找

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文件。通常,这涉及(在最高级别)设置环境变量

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


此处的文档:

我不确定原因,但路径似乎没有更新。
请尝试从“visual studio 2017的开发者命令提示符”运行您的命令。

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

我的设置是:

  • 视窗10,x64
  • Visual Studio Community 2017已安装,但仅用于C#开发
出于某种原因,安装的解决方案(正如@cozzamara所建议的)不起作用。在安装过程中停止,并显示一些模糊的错误消息。我猜它不喜欢我现有的VisualStudio安装

我就是这样解决的:

  • 启动VisualStudio安装程序
  • 检查(屏幕截图)
  • 编译前执行以下命令:

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat
    
    从此,命令
    cl.exe
    起作用。 或者(对于开发来说更方便)启动应用程序“”或“x64本机工具命令提示符VS 2017”


  • 我有一个类似的问题,Visual Studio 2017无法找到x64配置的CL.exe或MIDL.exe。从VS命令提示符中可以找到这些文件,但从VisualStudio构建时无法找到(但它确实适用于x86)

    当我打开构建输出到诊断的详细性(Tools=>Options=>Project&Solutions=>build&Run=>MSBuild Project构建输出详细性)时,我注意到在x64的“SetEnv”构建步骤中没有正确扩展路径。但无论我如何尝试重新安装VisualStudio、单个组件、sdk、运行时、注册表清理等,都没有解决问题(我几乎要重新安装Windows)

    BU,然后我发现VisualStudioC++项目可能会从应用程序数据文件夹中导入“用户。道具”文件;这是项目文件中的此部分:

    <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)在我的电脑上计算为C:\Users[username]\AppData\Local\Microsoft\MSBuild\v4.0,我在其中找到了Microsofr.Cpp.xxx.user.props文件。正是这些文件具有旧路径(早期安装和其他工具的遗留)


    因此,我的解决方案是删除AppData文件夹中的这些道具文件。

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

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

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

    #包括“cuda_runtime.h”
    #包括“设备启动参数.h”
    #包括
    cudaError\u t addWithCuda(int*c,const int*a,const int*b,unsigned int size);
    __全局无效addKernel(int*c,const int*a,const int*b)
    {
    int i=threadIdx.x;
    c[i]=a[i]+b[i];
    }
    int main()
    {
    常数int arraySize=5;
    常数int a[arraySize]={1,2,3,4,5};
    const int b[arraySize]={10,20,30,40,50};
    int c[arraySize]={0};
    //并行添加向量。
    cudaError\u t cudaStatus=addWithCuda(c、a、b、arraySize);
    if(cudaStatus!=cudaSuccess){
    fprintf(stderr,“addWithCuda失败!”);
    返回1;
    }
    printf({1,2,3,4,5}+{10,20,30,40,50}={%d、%d、%d、%d}\n),
    c[0],c[1],c[2],c[3],c[4]);
    //必须在退出之前调用cudaDeviceReset,以便进行分析和
    //跟踪工具,如Nsight和visualprofiler,用于显示完整的跟踪。
    cudaStatus=cudadeviceset();
    if(cudaStatus!=cudaSuccess){
    fprintf(stderr,“cudaDeviceReset失败!”);
    返回1;
    }
    返回0;
    }
    //辅助函数,用于使用CUDA并行添加向量。
    cudaError\u t addWithCuda(整数*c、常数整数*a、常数整数*b、无符号整数大小)
    {
    int*dev_a=0;
    int*dev_b=0;
    int*dev_c=0;
    cudaError\u t cudaStatus;
    //选择要在哪个GPU上运行,在多GPU系统上更改此选项。
    cudaStatus=cudaSetDevice(0);
    if(cudaStatus!=cudaSuccess){
    fprintf(stderr,“cudaSetDevice失败!是否安装了支持CUDA的GPU?”);
    转到错误;
    }
    //为三个向量分配GPU缓冲区(两个输入,一个输出)。
    cudaStatus=cudamaloc((void**)和dev_c,size*sizeof(int));
    if(cudaStatus!=cudaSuccess){
    fprintf(stderr,“cudamaloc失败!”);
    转到错误;
    }
    CUDA状态=
    
    #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;
    }