如何在Windows命令行中运行clang?

30

上周在 "Going Native" 大会上,Chandler Carruth 宣布了在 Windows 上运行 clang 的预构建二进制文件的存在。同样的信息在博客文章这里中提到。虽然预期受众是 Visual Studio 的用户,但我想从命令行中运行 clang。

我运行了安装程序并将 LLVM 的 bin 目录添加到路径中,但当我尝试编译 "Hello world" 时,我得到了以下错误:

C:\>clang hello.cpp
hello.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
         ^
1 error generated.

我找不到有关如何在Windows上配置运行clang的信息,我猜想在弄清楚如何告诉clang在哪里搜索标准库头文件之后,我还需要告诉它在哪里查找要链接的库。有人可以逐步为我讲解设置过程或指向这样的讲解吗?


应该是clang++吧?不过我不确定这有什么关系。 - Vittorio Romeo
@VittorioRomeo:使用clang++得到相同的结果(它的大小与clang.exe完全相同)。 - KnowItAllWannabe
1
我猜你应该先运行 VS2012 x86 Native Tools Command Prompt 或类似的东西,将 clang++.exe 添加到路径中,然后再尝试。 - Siyuan Ren
你解决过这个问题吗?我在Windows上使用LLVM 3.4时仍然会遇到类似的错误,例如在C(而不是C ++)文件中使用stdio.h。 - Baruch
我放弃了。我想在Windows上运行Clang,但是我没有时间进行研究项目。我会等待其他人为我完成这项艰巨的工作。 - KnowItAllWannabe
显示剩余3条评论
5个回答

21

这是一个老问题,自那时以来已经发生了很多变化。鉴于在Windows上尝试Clang时遇到的这个常见问题,它值得获得一份更新的答案。

截至2017年,使用LLVM 3.9.1构建Windows版本,您需要以下内容才能从shell中调用clang

VC++生成工具

我们仍然没有Windows版的libc ++端口,因此Clang使用VC ++库以及VC ++链接器。

所以首先需要在系统上安装VC++生成工具。请注意,如果您恰好拥有Visual C ++ IDE,则已经安装了这些工具。

环境变量

您需要告诉Clang在哪里找到生成工具及其库。

选项1(vcvarsall.bat)

这是最简单和标准的选项。

运行

> "%VS140COMNTOOLS%../../VC/vcvarsall.bat" amd64

amd64替换为Clang上的目标架构,可能是x86amd64arm。如果您使用不同版本的VC++工具集,则还可以替换%VS140COMNTOOLS%

作为快捷方式,您可以运行Visual C ++命令提示符而不是cmd+vcvarsall,因为您需要为每个打开的命令提示符调用此批处理。

现在您就可以享受Clang了。

选项2(手动)

如果您无法运行vcvarsall.bat或想要自动化此过程,欢迎,我也有同样的需求。

以下所有的环境变量都会被vcvarsall.bat自动设置,因此你可以运行它并从中获取你机器的值。我将使用我的值作为示例,希望其他地方也是一样的。
INCLUDE环境变量设置为C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE;C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt;C:\Program Files (x86)\Windows Kits\8.1\include\shared;C:\Program Files (x86)\Windows Kits\8.1\include\um;C:\Program Files (x86)\Windows Kits\8.1\include\winrt;LIB设置为C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64;C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64;C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64;。请注意体系结构特定的组件!
对于构建工具,你可以将工具放在PATH上或设置VCINSTALLDIR环境变量。Clang将尝试两种方式,并优先使用VCINSTALLDIR
VCINSTALLDIR设置为%VS140COMNTOOLS%../../VC或将%VS140COMNTOOLS%../../VC/bin/amd64添加到你的PATH中。
注:这些要求都很少有文档记录,因此随时可能会更改,但Clang MSVC driver正在尽可能自动化这些操作,通过查询Windows注册表和许多其他技巧来实现,因此未来可能不再需要这些步骤。

你确定Clang实际上读取那些环境变量吗?还是你假设了一些构建系统来读取它们。 - Timmmm
如果我通过命令行标志来执行它,我仍然会遇到错误 - vcruntime.h 中的 expected ';' after to level declarator expanded from '_CRT_BEGIN_C_HEADER' 和其他许多错误。 - Timmmm
1
@Timmmm 是的,非常确定,你可以在这里阅读一些MSVC驱动程序[https://github.com/llvm-mirror/clang/blob/master/lib/Driver/ToolChains/MSVC.cpp]并搜索这些环境变量。目前直接使用`clang ++`,所以没有构建系统。我从releases.llvm.org获取了Win64安装程序,并测试了Clang 3.9.1和4.0.0。 - Denilson Amorim
我认为最理想的方式是使用vswhere来获取路径。 - undefined

7
如果您不受限于使用微软编译器,可以使用MinGW-w64和clang。只需安装最新版本Windows版llvm二进制文件MinGW-w64即可。
您可以使用以下代码来编译您的源文件。
clang++ -target x86_64-pc-windows-gnu test.cc -o test.exe

这样可以消除警告“无法找到Visual Studio安装”,但它仍然无法在我的电脑上找到stdio.h。 - Jason S
也许你可以尝试使用 clang 而不是 clang++. - jdhao
clang 中,\MD\MT 的等效物是什么(不包括 clang-cl)? - Royi

1
使用Clang for Windows 5.0.0 (64位)(最新版本在这里可用;您需要LLVM-x.y.z-win64.exe),以及Visual Studio 2017社区版或构建工具,安装在它们的默认设置路径中(包括最新/匹配的Windows SDK):
C:\>clang --version
clang version 5.0.0 (tags/RELEASE_500/final)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin

我使用clang-clclang-cl.exe == clang.exe --driver-mode=cl)获得了良好的经验,它会自动查找所有必要的msvc库/包含文件依赖项:

C:\>clang-cl hello.cpp

或者编译为32位或64位应用程序:

C:\>clang-cl -m32 hello.cpp
C:\>clang-cl -m64 hello.cpp

替代方案

请参考Arvid Gerstmann的博客:在Windows上使用clang

参考资料


clang 中,\MD\MT 的等效物是什么(不包括 clang-cl)? - Royi

1
以下是我在Windows 10上通过终端使用clang编译器的步骤:
  1. 下载并安装Visual Studio 2022构建工具。这将安装并打开Visual Studio Installer
  2. Visual Studio Installer中,我选择了三个内容:
    1. 工作负载选项卡中的C++桌面开发
    2. 单个组件选项卡中的Windows C++ Clang编译器(13.0.1)
    3. 单个组件选项卡中的v143构建工具的C++ Clang-cl(x64/x86)
  3. 然后将clang.execlang++.exe的路径添加到我的PATH环境变量中。对于我来说,路径是C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\Llvm\x64\bin
完成上述步骤后,我就可以在终端中使用clang编译器了。要编译一个C程序,请进入源目录并输入:
clang *.c

要编译C++程序,请使用以下命令:

clang++ *.cpp

我希望这些信息对其他人有用。


0
这不是理想的情况。
考虑到这个问题从未得到解决,还有谁在使用批处理文件和cmd.exe?
我提供了一个更好的解决方案。
根据visualstudio.com上的帖子,他们忘记将路径添加到某个环境变量或者路径本身。
但是,不要担心,使用vswhere有一个简单而正确的方法。
我还提供了一个更容易使用的Enter-DevShell,现在可以从Powershell中使用。

function Get-VsWhere {
    param (
        [Parameter(ParameterSetName = "1")][String] $component,
        [Parameter(ParameterSetName = "1")][String] $find,
        [Parameter(ParameterSetName = "2")][String] $property
    )
    if (-not (Get-Command ./.build/vswhere.exe -ea Ignore)) {
        New-Item -ItemType Directory ./.build/ -Force | Out-Null
        Invoke-WebRequest https://github.com/microsoft/vswhere/releases/download/3.1.7/vswhere.exe -OutFile ./.build/vswhere.exe
    }
    $vswhere = (Get-Item ./.build/vswhere.exe).FullName
    if ($find) {
        & $vswhere -latest -requires $component -find $find
    }
    elseif ($property) {
        & $vswhere -latest -property $property
    }
}


function Get-Clang {
    if (-not $script:_clang) {
        $script:_clang = Get-VsWhere `
            -component Microsoft.VisualStudio.Component.VC.Llvm.Clang `
            -find '**/x64/**/clang.exe'
    }
    $script:_clang
}

$clang = Get-Clang
Add-PathVariable (Split-Path -Parent $clang)

# Add-PathVariable is from PSCX, it does what's on the label


function Get-DevShell {
    if (-not $script:_devshell) {
        $script:_devshell = Get-VsWhere `
            -component 'Microsoft.Component.MSBuild' `
            -find 'Common7/Tools/Microsoft.VisualStudio.DevShell.dll'
    }
    $script:_devshell
}

function Enter-DevShell {
    $module = Get-DevShell
    Import-module $module | Out-Null
    $vsinstall = Get-VsInstallPath

    Enter-VsDevShell -VsInstallPath $vsinstall -SkipAutomaticLocation | Out-Null
}


相关问题:
Visual Studio 2019版本的clang如何通过命令提示符进行官方访问?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接