Visual Studio 2022 中使用 Clang – 小众开发者
本文适用 Visual Studio 2017 以及更高版本
下载 LLVM for Windows
当前最新的 LLVM 版本是LLVM 14.0.3,在以下链接可以下载官方编译好的版本:
https://github.com/llvm/llvm-project/releases
- 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 的错误。
<Project>
<PropertyGroup>
<LLVMInstallDir>C:\Program Files\LLVM-14.0.3</LLVMInstallDir>
<LLVMToolsVersion>14.0.3</LLVMToolsVersion>
</PropertyGroup>
</Project>
还需要在项目属性中设置平台工具集:LLVM (clang-cl)
在 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
:
Clang VS MSVC
Clang 的报错信息友好度是 MSVC 比不了的。
#include <string>
#include <unordered_map>
class Element {
public:
// 注释掉声明后面的 const 让编译器报错
std::string name() /* const */ {
return m_name;
}
void insert(const Element& e) {
// 这里会报错,原因是 name 方法需要是 const 类型
m_elementMap[e.name()] = e;
}
private:
std::string m_name;
std::unordered_map<std::string, Element> m_elementMap;
};
MSVC 的报错信息:
1>ConsoleApplication1.cpp(62,1): error C2662: “std::string html::Element::name(void)”: 不能将“this”指针从“const html::Element”转换为“html::Element &”
1>ConsoleApplication1.cpp(62,26): message : 转换丢失限定符
1>ConsoleApplication1.cpp(37,21): message : 参见“html::Element::name”的声明
Clang 的报错信息:
1>ConsoleApplication1.cpp(62,26): error : 'this' argument to member function 'name' has type 'const html::Element', but function is not marked const
1>ConsoleApplication1.cpp(37,21): message : 'name' declared here