Visual Studio 2022 中使用 Clang – 小众开发者

本文适用 Visual Studio 2017 以及更高版本

下载 LLVM for Windows

当前最新的 LLVM 版本是LLVM 14.0.3,在以下链接可以下载官方编译好的版本:
https://github.com/llvm/llvm-project/releases
image.png

  • x86: LLVM-14.0.3-win32.exe
  • x86_64: LLVM-14.0.3-win64.exe
  • arm64: LLVM-14.0.3-woa64.zip

我下载的是 LLVM-14.0.3-win64.exe,安装在目录 C:\Program Files\LLVM-14.0.3

编译 Windows 平台的程序,就需要兼容 MSVC 的扩展和编译选项,所以在 Windows 上使用的前端是 clang-cl.exe

详情参考 LLVM 的文档:MSVC compatibility

在 MSBuild 中使用 Clang

在项目的根目录(就是 .sln 所在目录)下新建一个名称为 Directory.build.props 的项目属性文件:

内容如下,其中安装目录和版本号是必须指定的,否则会出现无法定位 Clang 的错误。

  1. <Project>
  2. <PropertyGroup>
  3. <LLVMInstallDir>C:\Program Files\LLVM-14.0.3</LLVMInstallDir>
  4. <LLVMToolsVersion>14.0.3</LLVMToolsVersion>
  5. </PropertyGroup>
  6. </Project>

还需要在项目属性中设置平台工具集LLVM (clang-cl)

Visual Studio 2022 中使用 Clang - 图2

在 CMake 中使用 Clang

Visual Studio 2017 开始支持打开 CMake 项目。

在 CMake 中使用 Clang 非常简单,只需要设置 CMAKE_CXX_COMPILER 的值为 clang-cl.exe 所在路径就可以了。

根据我自己的安装路径,我设置为 C:/Program Files/LLVM-14.0.3/bin/clang-cl.exe

Visual Studio 2022 中使用 Clang - 图3

Clang VS MSVC

Clang 的报错信息友好度是 MSVC 比不了的。

  1. #include <string>
  2. #include <unordered_map>
  3. class Element {
  4. public:
  5. // 注释掉声明后面的 const 让编译器报错
  6. std::string name() /* const */ {
  7. return m_name;
  8. }
  9. void insert(const Element& e) {
  10. // 这里会报错,原因是 name 方法需要是 const 类型
  11. m_elementMap[e.name()] = e;
  12. }
  13. private:
  14. std::string m_name;
  15. std::unordered_map<std::string, Element> m_elementMap;
  16. };

MSVC 的报错信息:

  1. 1>ConsoleApplication1.cpp(62,1): error C2662: std::string html::Element::name(void)”: 不能将“this”指针从“const html::Element”转换为“html::Element &”
  2. 1>ConsoleApplication1.cpp(62,26): message : 转换丢失限定符
  3. 1>ConsoleApplication1.cpp(37,21): message : 参见“html::Element::name”的声明

Clang 的报错信息:

  1. 1>ConsoleApplication1.cpp(62,26): error : 'this' argument to member function 'name' has type 'const html::Element', but function is not marked const
  2. 1>ConsoleApplication1.cpp(37,21): message : 'name' declared here

参考资料

Clang/LLVM support in Visual Studio projects