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 库?
错误:命令 'C:\\Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.14.26428\\bin\\HostX86\\x64\\cl.exe'
如何为 Visual Studio 构建工具 cl.exe 编写 makefile(nmake)