AI毛毛的blog

在Windows下配置MinGW版Qt的Clang编译器

今天在Windows下安装MinGW版本的Qt5时,发现mkspecs目录下有了win32-clang-g++这个文件夹,看起来MinGW版的qmake似乎也支持Clang的spec了,下面记录了一下验证和配置的过程。

下载与安装Windows版Clang

Clang的安装可以选择下面任意一种方式。

使用LLVM官网预编译版本

LLVM Download Page页面可以下载LLVM官方预编译好的LLVM Windows包(写这篇时,最新的包是9.0.0)。这个包里面主要包含Clang, LLD, compiler-rt, 还有一些别的LLVM tools之类的,直接安装就可以了。

使用Qt的预编译版本

Qt Downloads页面可以下载Qt官方预编译好的libClang Windows包(写这篇时,最新的包是8.0.1)。这个包里面主要包含Clang以及一些基本的Clang工具。我这里下载的是libclang-release_80-based-windows-mingw_64.7z,解压后将bin路径加入系统环境变量以方便正常使用。

手动编译

如果想对编译选项做一些调整,可以手动编译LLVM项目,不过略微耗时了,可以参考LLVM官方文档编译使用。

配置Clang的C++标准库

由于LLVM的标准库libc++并不支持Windows平台,所以Clang需要配置一下,让它使用Qt目录下MinGW的标准库。
以LLVM官网的预编译包为例,直接编译下面这段代码:

1
2
3
4
5
6
7
8
9
#include <iostream>

using namespace std;

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

会显示fatal error: 'iostream' file not found的错误,而且我们敲一下clang++ -v,结果如下:

1
2
3
4
clang version 9.0.0 (tags/RELEASE_900/final)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: D:\HeavyProgram\LLVM\bin

可以看到LLVM官网预编译的Clang默认Target为x86_64-pc-windows-msvc,是配合msvc编译器使用的,要让Clang使用MinGW,需要为clang指定命令行选项–target,这里可以使用--target=x86_64-pc-windows-gnu--target=x86_64-w64-mingw32,或者--target=x86_64-w64-windows-gnu。(如果是使用上面Qt预编译版本的Clang则不需要此操作,默认为x86_64-w64-windows-gnu)。

所以如果在命令行下执行Clang的话,也需要把MinGW的bin目录加入环境变量,这样Clang就会通过g++来寻找头文件与库文件,此操作可以直接set PATH或者手动添加。而在Qt Creator中执行则不需要,那里已经配置好了环境。

在Qt Creator中配置Clang

配置编译器选项

在Qt Creator编译器中添加Clang的路径并应用,如图所示:
clang1.png
注:如果使用的是Qt预编译版的Clang则只需要让Qt Creator自动发现即可,无需手动添加,LLVM官网的Clang才需要手动添加编译器以使ABI对应。

配置一个新的Kits

这里我直接克隆了一个,将编译器选项都改为Clang后,还要注意将Qt mkspec改为win32-clang-g++。如图所示:
clang2.png
此处选择GDB而非LLDB作为调试器,是因为LLVM预编译版的ABI不对应,如果有ABI对应的LLDB版本,也可以选择它作为调试器。

配置CMAKE选项(可选)

如果是使用LLVM官网预编译的Clang则需要此步骤,否则可跳过。在CMake Configuration中添加这两行,用以配合Clang的target:

1
2
CMAKE_CXX_FLAGS:STRING=--target=x86_64-w64-windows-gnu
CMAKE_C_FLAGS:STRING=--target=x86_64-w64-windows-gnu

如图所示:
clang3.png

完成上述步骤后,就可以在MinGW版的Qt中使用Clang编译器了,同时支持QMake与CMake。