在Windows系统中使用Clang的方法

42
我已经按照这份「分步指南」进行了操作,并且在一些尝试后,成功地使用Code::Blocks和MinGW编译了Clang。很好,现在我可以将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?我印象中它不支持。 - Billy ONeal
2
它可以在Windows上编译和运行 - 我已经做到了。只是标准库还没有成功。 - Luther
2
我几周前设法让最新版本的clang与MinGW配合工作,所以它肯定可以工作!你能否发布一下你对InitHeaderSearch.cpp所做的编辑?在我的MinGW安装中(它附带了MSysGit),c++config.h位于“c:/msysgit/mingw/lib/gcc/mingw32/4.4.0/include/c++/mingw32/bits”目录下。 - Mike Dinsdale
@mike 啊,也许这就是我的问题 - 我没有对 'InitHeaderSearch.cpp' 进行任何更改。你对那个文件做了什么更改? - Luther
4
从LLVM 3.1版本开始,Windows平台上提供实验性的Clang二进制文件:http://www.llvm.org/releases/download.html#3.1 - user634175
6个回答

22

这个页面中有一些构建clang的指令(在侧边栏的“Clang Development”部分中隐藏...)。 对于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
2
@Luther,当然可以使用-I。但请记住,您需要来自gcc-4.2.0的libstdc++头文件,不支持更新版本。 - SK-logic

7

根据您的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个领域基本上是独立的,并需要不同的技能和知识。


6
我遇到了类似的问题。我使用了GCC 4.7中指定路径的类似物,并使用"-isystem"标志(在rubenvb构建的mingw64发行版中的Clang 3.2)将它们指定给我的所有Clang可执行文件调用(通过脚本)。由于这些目录被明确指定为系统包含目录,因此它们生成的所有潜在繁琐的警告都会自动被抑制。
简而言之:-isystem标志在Clang中指定系统包含目录,且无需重新编译。

5

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

这个页面上有相关说明:http://clang.llvm.org/get_started.html

因此,请从其他编译器(如MingW)获取包含路径,并将它们硬编码到Clang中,然后它可能会工作。(我不确定Clang的Windows支持是否完全就绪)


(我不确定Clang在Windows上的支持是否已经完全到位)考虑到需要跨越多少障碍才能达到这一步,我相当肯定它还没有完全到位。有人正在积极开展工作吗?他们需要帮助吗? - Luther
1
我并没有积极参与开发,但是我已经订阅了他们的开发邮件列表一段时间了。从那里看来,似乎有几个人正在开发Windows支持(你可能会感兴趣的是,Linux支持也可能存在问题。特别是搜索路径问题也会影响Ubuntu和Fedora。GCC实际上也硬编码了它的搜索路径,所以为了成为GCC的即插即用替代品,Clang必须做类似的事情(尽管不够完美)。而且Windows开发者需要帮助吗?从我所读到的来看,他们肯定不会拒绝:) - jalf
目前,我怀疑自己对任何人都没有太大帮助,但是如果我能以某种不会出错的方式编译并运行它,我会尝试提交我的更改。 - Luther

3

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等。如果没有找到,则需要安装最新的Windows 10 SDK,方法是转到Visual Studio(安装程序)并单击Modify以添加软件包。

1
是的,它需要下载500 PB的微软垃圾,但至少这个能用。 - Jean-François Fabre

0
当我遇到同样的问题时,我只是为我的设置正确设置了Code Blocks的包含目录。它使用clang++和-I,到目前为止一切都很顺利。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接