如何用 clang 和 mingw-w64 编译?

How to compile with clang and mingw-w64?

我正在尝试将 clang10 与 mingw-w64 的 libstdc++ 一起使用,因为 MSVC headers 不支持 clang 10。我不介意没有标准库的新部分,我只是想使用新的语言功能。

我有 x86_64 的 mingw-w64 版本 8.1.0,安装了 POSIX 线程和 SEH 异常,我 运行 clang 有一个命令:

clang++ -target x86_64-pc-windows-gnu -std=c++20 ...

一切正常。所有应该在 clang 10 中实现的语言功能都可以工作,但是当我抛出任何异常时,当我 运行 程序(程序编译正常)时会发生这种情况:

Mingw-w64 runtime failure:
  Unknown pseudo relocation protocol version 65536.

我尝试使用 SJLJ 异常安装 mingw 并在 clang 中使用 -fsjlj-exceptions 标志,但该程序甚至无法编译:

C:\Users\egst\AppData\Local\Temp\test-f4a4de.o:test.cpp:(.text+0x82): undefined reference to `__gxx_personality_sj0'
C:\Users\egst\AppData\Local\Temp\test-f4a4de.o:test.cpp:(.text+0xd9): undefined reference to `_Unwind_SjLj_Register'
C:\Users\egst\AppData\Local\Temp\test-f4a4de.o:test.cpp:(.text+0x177): undefined reference to `_Unwind_SjLj_Resume'

clang++ --version 显示 Target: x86_64-pc-windows-msvc。也许我应该使用 x86_64-pc-windows-gnu 的版本?目前有什么方法可以使它工作,还是我应该等待 MSVC 的支持?除了 MSVC 和 MinGW 之外,还有其他选择吗?

根据@HolyBlackCat 的建议,我用 MSYS2 试了一下,效果很好。我只是安装了 MSYS2,然后从 MSYS bash 安装了 this 包。它会在 ...\msys2\mingw64 中安装所有内容。你得到 clang 10 (+ gcc 9.3) 和所有需要的 stl 头文件(尽管仍然没有像 <concepts> 这样的 c++20 头文件)。