在Windows上铿锵

Ale*_*aev 23 c++ windows mingw llvm clang

首先,我遵循了"入门:构建和运行Clang".特别是,我根据"使用Visual Studio"部分构建了它.换句话说,我使用Visual Studio 2010构建它.

其次,我手动设置MinGW发行版的包含和库路径:

在此输入图像描述

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

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, World!" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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.  
Run Code Online (Sandbox Code Playgroud)

显而易见的问题是 - 为什么我会这样做?

另外,我想了解更多细节,因为Clang网站提供了非常简短的信息 - 我认为有人可以向我澄清以下问题:

  1. 据我所知,Clang没有自己的标准库(我猜是stdc ++,不是吗?).这就是为什么我必须使用MinGW的标题和库 - 我是对的吗?
  2. 使用Visual Studio和MinGW构建Clang有什么区别?
  3. 我是否必须硬编码包含路径clang/lib/Frontend/InitHeaderSearch.cpp或者我可以跳过它,而是稍后通过"-I"选项指定这些路径,就像我在上面的屏幕截图中所做的那样?

rub*_*nvb 32

如果使用MSVS构建Clang,它将自动搜索默认的VS include路径,并拉入这些头.这就是libstdc ++标头产生错误的原因:它们正在导入VS头中不存在的C函数.使用Clang for C++和VS现在是不行的:由于Clang中缺少ABI(名称修改和其他)功能,您将获得链接失败.如果您仍想使用MSVS Clang,请不要将其指向MinGW标头.它将解析VS头(包括C++),它将无法链接.


编辑:我已经建立了一个dw2版本的GCC(仅限32位),伴随着Clang.例外工作在这个版本中,因此您可以在Windows上使用Clang构建真正的C++内容.在这里获取3.2版.

  • @rubenvb:关注分享重现构建所需的步骤?将是一个巨大的帮助. (6认同)
  • @Haroogan:我将MinGW-w64的包含路径注入到InitHeaderSearch.cpp中并计划维护它直到该代码被更好的代码取代.路径被硬编码为Clang.重要的是,这意味着您不必担心任何此类问题,您只需执行`clang somefile.c -o test.exe`,而无需向命令行添加标准包含路径.GCC也是如此:它知道它的所有标题所在的位置. (2认同)
  • 好吧,老实说,在Windows上构建Clang的官方指南建议使用Visual Studio构建它,同时知道它将使用Visual C++标准库,这会立即导致史诗般的失败...... (2认同)