MinGW介绍
MinGW(Minimalist GNU for Windows)可以理解为Windows版本的gcc编译器。作为编译器不但要能编译源码,还需要为源码提供依赖支持,如使用到的标准C++ API、系统API。在C++标准库里,MinGW还提供了一些类Unix API,如socket、file、动态库加载等。MinGW只能编译32程序,目前演变为MinGW-w64,可以编译64或32程序。
C++项目源码结构
- 项目源码
C++标准库
(编译器提供)系统API
(编译器提供)- 三方库
MinGW安装目录结构
- i686-w64-mingw32(编译32位程序的相关库)
- x86_64-w64-ming32(编译64位程序的相关工具和库)
MinGW使用
MinGW-w64使用
类比gcc工具使用,可直接编译成windows程序。无论是在mac、linux系统上,使用相关的指令都可直接编译成windows程序,如使用下面的指令即可编译出main.exe
x86_64-w64-mingw32-gcc.exe main.cpp -o main
注意事项:
MinGW编译出现的简单程序依赖以下两个库,该库位于MinGW根目录的bin目录,直接将这两个dll与exe文件放在一直即可正常执行。
- libunwind.dll
- libc++.dll
LLVM-MinGW使用
LLVM-MinGW是使用clang工具进行源码编译,相比于gcc它的产物更少,有更多优化,同时还能产出PDB文件。
相关编译工具
- clang
- clang++
- llvm-ar
下载地址:
https://github.com/mstorsjo/llvm-mingw/releases/download/20230614/llvm-mingw-20230614-msvcrt-x86_64.zip
LLVM-MinGW 工具链包括了 Clang 前端、LLVM 后端和 GNU 工具集等组件,其中 Clang 负责将源代码编译成 LLVM IR,LLVM 后端负责将 LLVM IR 编译成目标代码,GNU 工具集负责链接目标代码生成可执行文件。
使用 LLVM 编译器本身就可以将 C++ 代码编译成目标代码,然后使用链接器将目标代码链接成 DLL。理论上来说,使用 LLVM 编译器就可以将 C++ 代码编译成 DLL,不需要与 MinGW 结合使用。但LLVM 本身并不提供 C++ 标准库的实现,它只是一个编译器基础设施,主要负责将源代码编译成目标代码。在 Windows 平台上,C++ 标准库通常是由 Microsoft 的 Visual C++ 编译器提供,而 LLVM 编译器默认不支持使用 Visual C++ 标准库。如果使用 LLVM 编译器编译 C++ 代码,需要手动配置编译器,以便支持使用 Visual C++ 标准库。为了解决这个问题,可以使用 MinGW 工具集,它提供了一个名为 libstdc++ 的 C++ 标准库,可以在 Windows 平台上使用,从而更方便地将 C++ 代码编译成 DLL。
LLVM 编译器可以与不同的 C++ 标准库配合使用,包括但不限于 GNU C++ 标准库(libstdc++)和 Visual C++ 标准库(MSVCRT)。
C++标准库
- GNU C++标准库(libstdc++)
- Visual C++标准库(MSVCRT)
在使用 Clang 编译时,如果不指定 -target
参数,Clang 会根据当前系统的平台自动选择默认的目标平台。例如,在 Windows 平台上,Clang 的默认目标平台是 x86_64-pc-windows-msvc
,在 Linux 平台上,Clang 的默认目标平台是 x86_64-pc-linux-gnu
。所以使用Linux或Mac交叉编译Windows程序时一定要添加-target参数
。
以下是一些常用的 -target
参数值:
i686-pc-windows-gnu
:32 位 Windows 平台(使用 MinGW 工具链)x86_64-pc-windows-gnu
:64 位 Windows 平台(使用 MinGW 工具链)i686-pc-linux-gnu
:32 位 Linux 平台x86_64-pc-linux-gnu
:64 位 Linux 平台armv7a-linux-gnueabihf
:ARMv7 架构 Linux 平台(使用硬浮点 ABI)aarch64-linux-gnu
:ARMv8 架构 Linux 平台x86_64-apple-darwin
:macOS 平台
除了上述常用的目标平台之外,Clang 还支持许多其他的目标平台,例如 Android 平台、iOS 平台、FreeBSD 平台等。可以使用 clang -v
命令查看 Clang 支持的所有目标平台。
其他
1、生成PDB文件
2、i不展示控制台日志