今天碰到一个需求,将代码编译成exe格式,但我手头上只有linux系统,这就不得不用上交叉编译操作了。下面基于源码示例操作进行说明:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
常见的编译方式如下
gcc -o hello hello.c
有的大聪明将命令修改如下
gcc -o hello.exe hello.c
通过 上述命令生成的 hello.exe
文件在 Linux 或 macOS 系统上编译时,尽管文件名使用了 .exe
后缀,但它实际上是一个可在 Unix 系统上运行的可执行文件,并不是 Windows 可执行文件格式。直接在 Windows 上运行这个文件会导致错误。要生成可以在 Windows 上运行的可执行文件,您需要在 Windows 上使用 MinGW 或者在其他操作系统上使用交叉编译工具链来生成真正的 Windows 可执行文件。
(1)安装交叉编译工具
要安装交叉编译工具链(以 MinGW 为例)以在 Linux 或 macOS 上生成 Windows 可执行文件,您可以按照以下步骤操作:
》在 Linux 上安装 MinGW 交叉编译工具链
sudo apt update #更新源
sudo apt install mingw-w64 ##安装mingw
x86_64-w64-mingw32-gcc --version ##查看安装版本
x86_64-w64-mingw32-gcc -o hello.exe hello.c
》在 macOS 上安装 MinGW 交叉编译工具链
brew install mingw-w64
x86_64-w64-mingw32-gcc --version
x86_64-w64-mingw32-gcc -o hello.exe hello.c
这样生成的 `hello.exe` 文件可以直接在 Windows 系统上运行。其他注意事项
- - 如果需要生成 32 位的 Windows 可执行文件,可以使用 `i686-w64-mingw32-gcc` 编译器。
- - 可以通过安装 `mingw-w64` 包来支持更多的 Windows 版本和架构。
通过这些步骤,您就可以在 Linux 或 macOS 上轻松生成 Windows 可执行文件。
关于 MinGW-w64 支持的编译器和架构的总结如下:
类别 | 支持内容 | 描述 |
---|---|---|
支持的编译器 | GCC (GNU Compiler Collection) | MinGW-w64 工具链的核心编译器,支持 C、C++ 等语言的编译,生成 Windows 可执行文件和库文件。 |
Clang/LLVM | Clang 可以与 MinGW-w64 配合使用,通过 LLVM 后端生成 Windows 可执行文件,提供与 GCC 兼容的命令行界面,并带来更多优化和诊断信息。 | |
支持的目标架构 | x86 (32-bit) | 生成 32 位 x86 架构的 Windows 可执行文件。使用 i686-w64-mingw32-gcc 编译器进行交叉编译。 |
x86_64 (64-bit) | 生成 64 位 x86_64 架构的 Windows 可执行文件。使用 x86_64-w64-mingw32-gcc 编译器进行交叉编译。 | |
ARM (32-bit) | 生成适用于 Windows on ARM 的 32 位 ARM 架构可执行文件。需要使用 arm-w64-mingw32-gcc 或类似的交叉编译器(可能需要自定义构建或使用其他工具链)。 | |
ARM64 (64-bit) | 生成适用于 Windows on ARM 的 64 位 ARM 架构可执行文件。使用 aarch64-w64-mingw32-gcc 或类似的交叉编译器(需要确认工具链的支持情况)。 | |
安装与使用 | Linux 和 macOS | 可以通过包管理器(如 apt 或 brew )安装 MinGW-w64 工具链。安装后使用相应的编译器命令(如 i686-w64-mingw32-gcc 、x86_64-w64-mingw32-gcc )进行编译。 |
对于 C++ 程序,在 MinGW-w64 工具链中,您可以选择 g++
编译器来生成适用于 Windows 系统的可执行文件,只需要将上面的gcc换成g++即可。
(2)基于docker编译
如果需要在x86架构上编译生成arm端运行的程序,可以基于docker构建交叉运行环境,此时可以参考博客docker安装使用系列之交叉编译-CSDN博客。在不同架构和操作系统上进行交叉编译,无论是ARM架构上编译x86程序,x86上编译ARM程序,还是在macOS上编译运行于Windows上的可执行程序,或者在Windows上编译其他系统的程序,这些场景都涉及到交叉编译的概念。每种交叉编译场景可能需要不同的工具链和环境配置。例如,编译Windows程序可能需要使用Microsoft Visual Studio或MinGW,而编译Linux程序可能需要使用GCC或Clang。交叉编译工具可以直接本地安装也可以基于docker来实现。