在Windows上使用Clang

23
首先,我按照“开始使用:构建和运行Clang”的步骤操作。特别是,我按照“使用Visual Studio”部分的指导进行构建,并且使用了Visual Studio 2010。
其次,我手动设置了MinGW发行版的包含路径和库路径:

enter image description here

我正在尝试编译的简单程序:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, World!" << endl;
    return 0;
}

我从编译器获得以下反馈:

In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\iostream:39:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\ostream:39:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\ios:38:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\iosfwd:41:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\bits/postypes.h:41:
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:144:11: error: no member named 'fgetws' in the global namespace
  using ::fgetws;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:146:11: error: no member named 'fputws' in the global namespace
  using ::fputws;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:150:11: error: no member named 'getwc' in the global namespace
  using ::getwc;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:151:11: error: no member named 'getwchar' in the global namespace
  using ::getwchar;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:156:11: error: no member named 'putwc' in the global namespace
  using ::putwc;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:157:11: error: no member named 'putwchar' in the global namespace
  using ::putwchar;
        ~~^
6 errors generated.
Build error occurred, build is stopped
Time consumed: 646  ms.  

显而易见的问题是 - 为什么会出现这种情况?
此外,我想了解更多细节,由于Clang网站提供的信息非常简要 - 所以我想有人可以澄清以下问题:
1.就我所知,Clang没有自己的标准库(我猜是stdc++,不是吗?)。这就是为什么我必须使用MinGW的头文件和库 - 我是对的吗?
2.使用Visual Studio和MinGW构建Clang之间有什么区别?
3.我是否必须在clang/lib/Frontend/InitHeaderSearch.cpp中硬编码包含路径,还是可以跳过它,并像我在上面的截图中那样稍后通过“-I”选项指定这些路径?

2
жҲ‘иҝҮеҺ»дҪҝз”Ёзҡ„з»„еҗҲжҳҜдҝ®ж”№InitHeaderSearch.cppд»ҘеҢ…еҗ«жҲ‘зҡ„MinGWеҢ…еҗ«ж–Ү件зҡ„и·Ҝеҫ„пјҢ然еҗҺдҪҝз”ЁMinGWе·Ҙе…·й“ҫиҝӣиЎҢжһ„е»әгҖӮжҲ‘иҝҳиғҪеӨҹдҪҝз”ЁVisual C++е·Ҙе…·й“ҫиҝӣиЎҢжһ„е»әпјҢдҪҶжҲ‘ж— жі•жүҫеҮәеҰӮдҪ•и®©е·Іжһ„е»әзҡ„зј–иҜ‘еҷЁеҲ©з”ЁMinGWе®үиЈ…дёӯзҡ„еӨҙж–Ү件е’Ңеә“пјҲеӣ дёәVisual C++ C++ж ҮеҮҶеә“еӨҙж–Ү件дҫқиө–дәҺVisual C++зү№е®ҡеҠҹиғҪпјүгҖӮ - James McNellis
3
是的,那正是我所思考的。但对我来说最大的困惑是,使用 Visual C++ 或 MinGW 构建与 Clang 编译器在利用包含和库路径方面有什么关系。换句话说,在编译 Clang 后,我必须能够自由选择这些路径。为什么这些路径会依赖于我用来构建 Clang 的编译器呢? - Alexander Shukaev
1
@JamesMcNellis:Clang 目前应该能够解析 VC++ 标头文件。唯一有问题的解析区域是 MFC,如果我没记错的话。 - rubenvb
1
@Haroogan 我完全同意你的观点。我一直在尝试在Windows上让clang插件在Sublime Text 2上运行,但奇怪的stdc++/header问题...嗯,很奇怪。 - Steven Lu
2个回答

32
如果您使用MSVS构建Clang,它将自动搜索默认的VS包含路径,并引入这些头文件。这就是libstdc++头文件产生错误的原因:它们导入了在VS头文件中不存在的C函数。目前,在VS中使用Clang进行C++编程是不可行的:由于Clang缺少ABI(名称重整等)功能,您将会遇到链接失败的问题。如果您仍想使用MSVS Clang,请勿将其指向MinGW头文件。它将解析VS头文件(包括C++),但无法成功链接。

编辑:我已经构建了一个dw2版本的GCC(仅支持32位),并附带了Clang。在这个版本中,异常可以正常工作,因此您现在可以在Windows上使用Clang构建真正的C++代码。点击此处获取3.2版本


1
有没有预编译的Clang二进制包? - Mr.Anubis
@Mr.Anubis:是的,我为我构建的每个GCC版本都有一个Windows版的Clang。但你不能单独使用它。 - rubenvb
2
@Haroogan:我将MinGW-w64的包含路径注入到InitHeaderSearch.cpp中,并计划在更好的代码取代它之前一直维护它。这些路径已经硬编码到Clang中。重要的是,这意味着您不必担心任何问题,只需执行“clang somefile.c -o test.exe”即可,无需在命令行中添加标准包含路径。GCC也是如此:它知道所有头文件的位置。 - rubenvb
2
好吧,但说实话,在 Windows 上构建 Clang 的官方指南建议使用 Visual Studio 进行构建,而知道它将使用 Visual C++ 标准库,这立即导致了失败... - Alexander Shukaev
6
@rubenvb:您能分享一下重现您构建所需的步骤吗?这将是极大的帮助。 - marton78
显示剩余11条评论

1

显而易见的答案是你忘了向clang++发送-fno-ms-compatibility :P

  1. 你说得对。
  2. VC++是GUI工具链,MinGW是字符控制台。
  3. 不,因为clang已经足够成熟,可以公开使用,但仍需要稳定下来,所以让它的开发团队继续处理代码,否则你可能会遇到可能变成失落之岛的工作。我正在使用-I,就像你的示例建议的那样。

我正在使用VS进行Windows应用程序开发,并使用clang + CodeBlocks共享与平台领域无关的方面。


1
VC++ <-> MinGW。VC++ 不是 GUI,它有一个命令行界面。 - rubenvb
“GUI 工具链”并不是 GUI。它是带有 GUI 的工具链,包含在默认安装中。 - Chawathe Vipul S

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