MinGW-w64编译Windows程序

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不展示控制台日志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值