让 Clang 在 Windows 上工作

Posted

技术标签:

【中文标题】让 Clang 在 Windows 上工作【英文标题】:Getting Clang to work on windows 【发布时间】:2011-06-29 18:08:05 【问题描述】:

我遵循了以下step by step guide,经过一番摆弄后,我设法让 clang 使用 code:blocks 和 MinGW 进行编译。太好了,所以现在我可以将 Clang 模块添加到 Eclipse(当你可以有四个 IDE 时为什么还要有一个)并开始编译。

我可以编译一个不使用标准库的简单程序,但不幸的是,当我尝试编译时:

#include <iostream>
using namespace std;

int main()

    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;

首先我明白了:

..\src\test.cpp:9:10:致命错误:找不到“iostream”文件

所以我将 Mingw 标头添加到包含路径;然后我明白了:

'致命错误:'bits/c++config.h' 文件 没找到”

这很奇怪。如果该文件不在'bits/'中,为什么MingW会工作?它内置在编译器中吗?没关系,我找到了它的实现并在 'bits/' 中创建文件。

然后我收到一大堆错误,包括奇怪的错误,这些错误似乎表明 clang 没有正确实现预处理器,或者我对预处理器的理解不正确。

C:\Program Files\CodeBlocks\MinGW\lib\gcc\mingw32\4.4.1\include\c++/cwchar:45:26: error: expected value in expression
#if _GLIBCXX_HAVE_WCHAR_H

还有更多类似的。那应该是

#if defined(_GLIBCXX_HAVE_WCHAR_H) 

#ifdef _GLIBCXX_HAVE_WCHAR_H?

如果是,那么 MinGW 标准库是错误的。

我认为我认为可以放入 clang 以替换 gcc 并且它不是为与 gnu 标准库一起使用而设计的是不正确的。任何有证据支持的确认或否认都将受到欢迎!

那么,有没有人有万无一失的方法来在 Windows PC 上编译 clang?网上关于 clang 的信息非常缺乏,尤其是关于 windows 的信息。

我真的很想让 clang 和 LLVM 工作,因为从我所读到的内容中它们听起来很棒。任何帮助将不胜感激。

谢谢。

【问题讨论】:

Clang 是否支持 Windows?我的印象是它没有。 它确实可以在 Windows 上编译和运行——我已经做到了。只是标准库还没有运气。 几周前我设法让最新版本的 clang 与 MinGW 一起工作,所以它肯定可以工作!您能否发布您对 InitHeaderSearch.cpp 所做的编辑?在我安装的 MinGW(MSysGit 附带)中,c++config.h 位于“c:/msysgit/mingw/lib/gcc/mingw32/4.4.0/include/c++/mingw32/bits”中 @mike 啊,也许这是我的问题 - 我没有对“InitHeaderSearch.cpp”进行任何更改。您对该文件做了哪些更改? 从 LLVM 3.1 开始,有适用于 Windows 的实验性 Clang 二进制文件:llvm.org/releases/download.html#3.1 【参考方案1】:

有一些关于在this page 上构建clang 的说明(隐藏在侧边栏的“Clang 开发”部分...)。对于 MinGW,您需要名为“On Unix-like Systems”的部分。唯一棘手的部分是第 5 步,它告诉您如何设置 C++ 标准库的路径。这些需要添加到clang/lib/Frontend/InitHeaderSearch.cpp 的代码中。在我的机器上它看起来像这样

// FIXME: temporary hack: hard-coded paths.
AddPath("/usr/local/include", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/include/c++", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/include/c++/mingw32", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/include/c++/backward", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../include", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/include", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/include-fixed", System, true, false, false);

虽然我不确定是否需要所有这些!

【讨论】:

哇...硬编码的搜索路径。如果非硬编码的搜索路径也可以做同样的事情,那也不错。你知道是不是这样吗? @Luther,是的,你当然可以使用 -I。但请记住,您需要来自 gcc-4.2.0 的 libstdc++ 标头,不支持更新版本。【参考方案2】:

根据您的 MinGW 版本(以及移植的 gcc 版本),标头可能有点分散...

在文件clang/lib/Frontend/InitHeaderSearch.cpp 中,您会发现许多硬编码路径。问题是每个版本都是特定的,所以如果你的 MinGW 版本不在那里,请随意添加它(并通过将补丁发布到 cfe-commit 来要求它集成到 Clang 的主线中)。

就我个人而言,我在 MinGW/msys 上运行它,只有小问题(许多测试用例失败,因为我的 msys shell 在...中存在: 时会破坏输入),但我没有尝试在 CodeBlocks 中使用它(我习惯了命令行)。

如果您想提供帮助,Takumi 正在关注 MinGW 集成,Francois Pichet 正在领导与 VC++/MFC 头文件的兼容性工作(即主要贡献者),@rubenvb 目前正在尝试推送 libc++ 上的补丁以它在 Windows 上工作(libc++ 尚未在 Windows 上编译)。这 3 个领域非常独立,需要不同的技能和知识。

【讨论】:

【参考方案3】:

我遇到了类似的问题。我使用了 GCC 4.7 与 Mike Dinsdale 的答案指定的路径的类似物,并使用“-isystem”标志(由 rubenvb 构建的 mingw64 发行版中的 Clang 3.2)来指定我未来对 clang 可执行文件的所有调用(通过脚本)。由于这些目录被明确指定为 system 包含目录,因此它们生成的所有可能令人讨厌的警告都会被自动抑制。

tl;dr:-isystem 标志在 Clang 中指定 system 包含目录 无需重新编译

【讨论】:

【参考方案4】:

Clang 确实有硬编码的搜索位置,如文件 clang/lib/Frontend/InitHeaderSearch.cpp 中定义的那样,靠近注释 FIXME: temporary hack: hard-coded paths

在这个页面上有一个关于它的注释:http://clang.llvm.org/get_started.html

因此,从您的其他编译器 (MingW) 获取包含路径,并将它们硬编码到 Clang 中,它可能可以工作。 (我不确定 Clang 的 Windows 支持是否 100%)

【讨论】:

>>(我不确定 Clang 的 Windows 支持是否 100%)我很确定它不是,因为需要多少圈才能做到这一点。有没有人在积极努力?他们需要帮助吗? 我没有积极参与开发,但我订阅了他们的开发邮件列表有一段时间了。由此看来,似乎确实有一些人在致力于 Windows 支持(您可能会感兴趣的是,Linux 支持可能同样不稳定。特别是,搜索路径问题也会影响 Ubuntu 和 Fedora。GCC 有效地对其搜索进行硬编码路径也是如此,所以为了成为 GCC 的替代品,Clang 必须做类似的事情(尽管方式不那么精致)。Windows 开发人员需要帮助吗?从我读到的内容来看,他们肯定不会不要说不:) 目前,我怀疑我对任何人都有多大帮助,但如果我能以某种万无一失的方式编译和运行它,我会尝试提交我的更改。跨度> 【参考方案5】:

Windows 10 / VS 2017 / Clang 4.0.0 在 C 代码中缺少 stdlib.h。我就是这样解决的:

打开x86_x64 Cross Tools Command Prompt for VS 2015/2016/2017。在此处运行 clang 应该可以消除“缺少标头”错误。 如果仍然无法正常工作,则您缺少实际的头文件和/或库,因为 Clang 将这些平台特定信息留给了 VS 或 MinGW。转到\Program Files (x86)\Windows Kits\10\Include\ 并在其子目录(如果有)中搜索stdlib.h 和co。如果没有找到,您需要安装最新的Windows 10 SDK,方法是转到 Visual Studio(安装程序)并单击Modify 以添加包。

【讨论】:

是的,它需要下载 500 PB 的 MS 垃圾,但至少可以。【参考方案6】:

当我遇到同样的问题时,我只是将代码块设置为我的设置的正确包含目录。它使用 -I 和 clang++,到目前为止一切都很好。

【讨论】:

以上是关于让 Clang 在 Windows 上工作的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上使用 -faddress-sanitizer 进行 Clang

在控制台中看不到 Windows 程序的标准输出(在 Windows 上使用 Clang 编译)

使用 CMake、Clang 和 Ninja 在 Windows 上构建 c++ 项目

在 Windows 上使用 Clang 链接 SDL2 时出错“LNK1561:必须定义入口点”

Windows下的Mingw + clang vs Boost:不同类型的错误

使用 MSVC2015 在 Windows 上进行 clang-tidy