“Clang with Microsoft CodeGen”和“LLVM-vs2014”有啥区别?

Posted

技术标签:

【中文标题】“Clang with Microsoft CodeGen”和“LLVM-vs2014”有啥区别?【英文标题】:What's the difference between "Clang with Microsoft CodeGen" and "LLVM-vs2014"?“Clang with Microsoft CodeGen”和“LLVM-vs2014”有什么区别? 【发布时间】:2017-03-04 07:31:52 【问题描述】:

在 Visual Studio 2015 或更高版本下,我们可以通过两种方式使用 clang:

    选择Clang with Microsoft CodeGen作为Platform Toolset

    安装LLVM-3.8-win64.exe,并选择LLVM-vs2014作为Platform Toolset

我知道这两种方式都使用相同的编译器:clang 3.8。但是,我不知道它们之间有什么区别。

我的经验表明Clang with Microsoft CodeGenLLVM-vs2014 更易于调试。换句话说:

    我可以像VC++那样一步步调试Clang with Microsoft CodeGen构建的程序;

    “LLVM-vs2014”构建的程序无法在源码级逐步调试,但程序可以直接按预期运行。

所以,我的问题是:

LLVM-vs2014 不支持 Visual Studio 下的源码级调试吗?

Clang with Microsoft CodeGen是微软提供的,只是为了支持Visual Studio下的源码级调试吗?

【问题讨论】:

Clang 只提供编译器的前端。更好的错误报告是它的名声。其他人提供后端、代码生成器和优化器。如果您使用 VS 提供的工具集,那是 Microsoft 的。但是,如果您使用另一个,您可以使用 LLVM 自带。他们并没有为此大吵大闹,传统上异常处理是症结所在。当然,调试是一个问题,你不能依赖 VS 提供的调试器引擎。在我看来,您需要 lldb,它也是 LLVM 包的一部分。 Clang-cl 看起来像是接受 MSFT 怪癖的前端调整。 【参考方案1】:

我知道这两种方式都使用相同的编译器:clang 3.8。但是,我不知道它们之间有什么区别。

区别在于他们如何使用它。

Clang with Microsoft CodeGen 正在使用 Clang 将源代码解析为 AST。但是随后 MSVC 的代码生成器启动了,因此不会使用任何与 LLVM 相关的内容。

LLVM-vs2014 在每个编译阶段都完全使用 Clang。它使用 LLVM 来生成代码。因此,难怪调试信息与 Visual Studio 所期望的不兼容。

需要注意的是,它们都使用相同的运行时。 Clang 具有clang-cl 模式,使其能够解析 Microsoft 标头并使用它们的语言扩展。

所以,主要区别在于中后端阶段。

【讨论】:

以上是关于“Clang with Microsoft CodeGen”和“LLVM-vs2014”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章