为Windows创建本地的Mingw-w64编译器

hamster 2021-05-06 PM 89℃ 0条

最近需要在Windows上搭建C/C++的开发环境,首先要安装的就是编译器。微软提供的C/C++编译器是MSVC,不过MSVC和Visual Studio捆绑,过于庞大,所以我们还是选择更轻量级的Mingw-w64。Mingw-w64实际上是Windows版本的GCC,为了能够将GCC移植到Windows上,Mingw-w64通过一组头文件把部分Posix系统调用翻译为Windows API,并且开发了一个C Runtime (CRT)来替代Glibc。Mingw-w64可以直接下载安装,但是这里我们选择通过编译源代码来创建Mingw-w64,好处在于可以很方便地控制GCC版本。为了提升工作效率,我们在Linux环境下,通过交叉编译的方式产生Windows本地的Mingw-w64编译器。编译32位工具链和64位工具链的命令稍有不同,在文中有相应说明。

开发环境搭建

开发环境可以在任意主流Linux发行版上搭建。以Debian Buster为例,我们通过apt命令安装基本开发环境

sudo apt install g++ autoconf automake make patch autopoint bison gawk texinfo

此外,还需要安装交叉编译的Mingw-w64编译器,请按照另一篇教程「在Linux上创建Mingw-w64交叉编译器」提供的步骤安装。

准备工作

为了方便,设置环境变量

export TARGET=x86_64-w64-mingw32
export BUILDDIR=$HOME/mingw64-native
export CROSS_BUILDDIR=$HOME/mingw64-cross
export GCC_VERSION=11.1.0
export MINGW_VERSION=9.0.0

其中TARGET表示目标平台,BUILDDIR为安装目录,CROSS_BUILDDIR表示交叉编译工具链的安装路径,GCC_VERSION表示GCC版本,MINGW_VERSION表示Mingw-w64版本。

如果要编译32位的工具链,应该把TARGETCROSS_BUILDDIRBUILDDIR设置为

export TARGET=i686-w64-mingw32
export BUILDDIR=$HOME/mingw32-native
export CROSS_BUILDDIR=$HOME/mingw32-cross

下载需要的源代码

mkdir $BUILDDIR/tmp -p
cd $BUILDDIR/tmp
wget http://ftp.gnu.org/gnu/gcc/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.xz
wget http://ftp.gnu.org/gnu/binutils/binutils-2.36.1.tar.xz
wget http://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.xz
wget http://www.mpfr.org/mpfr-4.1.0/mpfr-4.1.0.tar.xz
wget https://ftp.gnu.org/gnu/mpc/mpc-1.2.1.tar.gz

编译Binutils

cd $BUILDDIR/tmp
tar -xf binutils-2.36.1.tar.xz
cd binutils-2.36.1
./configure --prefix=$BUILDDIR --host=$TARGET --target=$TARGET --with-sysroot=$BUILDDIR --disable-multilib
make && make install

安装Mingw-w64头文件

cd $CROSS_BUILDDIR/tmp/mingw-w64-v$MINGW_VERSION/mingw-w64-headers
make install prefix=$BUILDDIR/$TARGET

编译GCC

cd $BUILDDIR/tmp
tar -xf gcc-$GCC_VERSION.tar.xz
cd gcc-$GCC_VERSION
tar -xf ../mpfr-4.1.0.tar.xz
mv -v mpfr-4.1.0 mpfr
tar -xf ../gmp-6.2.1.tar.xz
mv -v gmp-6.2.1 gmp
tar -xf ../mpc-1.2.1.tar.gz
mv -v mpc-1.2.1 mpc
mkdir build
cd build
../configure --prefix=$BUILDDIR --host=$TARGET --target=$TARGET --with-sysroot=$BUILDDIR --disable-multilib --disable-shared --enable-languages=c,c++ --enable-threads=posix

其中configure选项--enable-languages=c,c++定义启用的编程语言,--disable-shared的作用是可以让GCC编译出的程序不需要libgcc.dll就能运行,--enable-threads=posix表示线程模型为posix。当目标平台为Windows时,默认的线程模型为win32,这里为了完整支持C++ std::thread,需要将线程模型手动设置为posix。

因为编译器会在路径$BUILDDIR/mingw下搜索Mingw-w64的头文件,所以需要创建一个符号链接

ln -s $TARGET  $BUILDDIR/mingw

正式编译安装

make && make install

安装Mingw-w64的CRT

cd $CROSS_BUILDDIR/tmp/mingw-w64-v$MINGW_VERSION/mingw-w64-crt/
make install prefix=$BUILDDIR/$TARGET

安装winpthreads

cd $CROSS_BUILDDIR/tmp/mingw-w64-v$MINGW_VERSION/mingw-w64-libraries/winpthreads/
make install prefix=$BUILDDIR/$TARGET

打包发布

最后做一些工作来打包发布我们编译的Mingw-w64编译器。首先删除临时文件

cd $BUILDDIR/  
rm -rf $BUILDDIR/tmp/
rm $BUILDDIR/mingw
rm -rf $CROSS_BUILDDIR/tmp

$TARGET-strip命令来缩减体积可执行文件和库文件的体积

cd $BUILDDIR/
find -name "*.exe" -type f -exec $TARGET-strip -s {} ";" >& /dev/null
find -name "*.a" -type f -exec $TARGET-strip -d {} ";" >& /dev/null
find -name "*.o" -type f -exec $TARGET-strip -d {} ";" >& /dev/null

最后用7-Zip进行压缩打包。安装7-Zip的命令为

sudo apt install p7zip-full

打包命令为

cd $BUILDDIR/..
7z a  GCC-11.1.0-crt-9.0.0-posix.7z $BUILDDIR

生成的压缩包为GCC-11.1.0-crt-9.0.0-posix.7z,文件名中11.1.0是GCC版本,9.0.0是Mingw-w64版本,posix是线程模型。通过这篇教程创建的Mingw-w64编译器可以通过下面的链接下载

GCC 11.1.0 for Windows 64 bit
File name: GCC-11.1.0-crt-9.0.0-posix.7z
MD5: 2b43ca9786624ba5be2d0a3fb365763b
Size: 51M
标签: GCC, Mingw-w64

非特殊说明,本博所有文章均为博主原创。

评论啦~