clang-cl /fallback 模式
最近,为了将 LLVM 工具链引入 Windows 平台(参见 Windows 上 LLVM 工具链的前进方向),做了很多工作。这项工作的结果之一是 Clang 的一种新的驱动模式:clang-cl。这种模式使 Clang 可以理解与 Visual Studio 编译器 cl.exe 相同类型的命令行参数。例如,使用 Clang 将文件编译成可执行文件的典型命令可能是“clang hello.cc -o hello”,而使用 cl.exe,则使用“cl.exe hello.cc /Fehello”。现在,可以通过用“clang-cl”替换“cl.exe”来使用 Clang 的后一种语法。这使得 Clang 能够轻松地用于 Visual Studio 中的现有项目。
在大多数情况下,clang-cl 接受与 cl.exe 完全相同的参数。但是,它也接受一些 Clang 特定的选项。最近添加的一个这样的选项是/fallback 标志。此标志的目的是即使在 Clang 无法编译所有代码的项目中也能轻松使用 clang-cl。这篇文章给出了如何使用 /fallback 的示例。
clang-cl 在 /fallback 模式下的工作方式是,它首先尝试使用 Clang 编译代码,如果由于某种原因失败,则回退到使用 cl.exe 编译。考虑以下两个文件,其中 main.cpp 可以由 Clang 编译,但 printer.cpp 无法编译。
printer.cpp:
#include <iostream>
void print_hello(const char *s) {
std::cout << "Hello from " << s << "!" << std::endl;
}
main.cpp:
extern void print_hello(const char*);
int main(int argc, char **argv) {
print_hello(argv[0]);
return 0;
}
clang-cl 无法编译 printer.cpp,因为它包含了 iostream,而 iostream 使用了目前尚不支持的语言特性(希望很快就会支持)。但是,clang-cl 仍然可以在回退模式下编译这两个文件。
clang-cl /fallback /Fehello main.cpp printer.cpp
Clang 将成功编译 main.cpp,并打印一些关于它不支持 printer.cpp 特性的错误消息,然后回退到 cl.exe 编译器来编译该文件。编译后的文件将链接在一起形成 hello.exe。
注意,这并不完美:即使 clang-cl 认为它已经成功编译了文件,生成的代码中也可能存在导致链接或运行时失败的错误。
目前,回退模式将导致 clang-cl 在任何类型的错误上回退。将来,它将被更改为只在某些类型的内部错误上回退,随着 Clang 对 Windows 支持的改进,回退模式最终将变得不必要并被移除。clang-cl 仍处于早期阶段,但您可以从 LLVM 快照构建网站 下载工具链自己尝试一下。