How to build a Mingw-w64 x86_64-w64-mingw32 cross-compiler.
(At this time, building a native compiler is suggested. Documentation to follow. This is all still required to be able to build it.) Top-level configure to do this all with one command is also to follow.
As of 2009-05-31, x86_64-pc-mingw32 has been replaced by x86_64-w64-mingw32. The change allows for mingw-w64 to have a host/target type independent of mingw.org's MinGW.
All default libraries work! We are now in a functional beta stage.
This file describes how to build the Mingw-w64 GCC toolchain as a cross-compiler on Cygwin, MinGW with MSys, and *nix shells.
Cygwin 1.7 currently supported. This document recommends and assumes Bash (for Cygwin, Unix), or MSys core sh default shells are used.
This document is written to help those new to building the mingw-w64 cross compilers on Windows using MSYS/MinGW and Cygwin. It can also be adapted slightly for building the mingw-w64 cross compiler on Linux.
For a more advanced guide on building the mingw-w64 cross compiler including the optional dependencies, please refer to the "mingw-w64-howto-build-adv.txt" guide.
Date
Version
Author
2007-07-31
1.0
Kai Tietz <Kai.Tietz at onevision.com>
2007-08-20
1.1
Kai Tietz <Kai.Tietz at onevision.com>
2007-08-21
1.2
NightStrike? <nightstrike at gmail.com>
2007-10-01
1.3
NightStrike? <nightstrike at gmail.com>
2007-11-27
1.4
NightStrike? <nightstrike at gmail.com>
2009-05-31
1.5
Xenofears <xenofears at gmail.com>
2009-06-06
1.6
Xenofears <xenofears at gmail.com>
2009-08-28
1.7
Xenofears <xenofears at gmail.com>
2009-08-30
1.8
Ozkan Sezer <sezeroz at gmail dot com>
2009-10-09
1.9
Jonathan Yong <jon_y[a]users.sourceforge.com>
2010-02-28
1.10
Ozkan Sezer <sezeroz at gmail dot com>
2010-08-31
1.11
Jonathan Yong <jon_y[a]users.sourceforge.com>
2010-10-05
1.12
Nicolas Guillaumin
2013-01-21
1.13
Jonathan Yong <jon_y[a]users.sourceforge.com>
You can search the keys (i.e. [BLDCRT]) to jump to that section.
You will need a complete GCC toolchain for the host system (Cygwin, MinGW/MSys or Linux), which usually includes all of the required components:
Optional for source download / version management:
Optional for optimization enhancements: (Math toolchain dependencies are elaborated on GMP)
To build with MSys (Minimal SYStem for Win32), to satisfy the requirements download and install functional MinGW (GCC toolchain), MSYS (sh shell), bison, and flex.
If your host OS is Vista, you must install SP1 or SP2! If you can't, you must use an unoptimized collect2.exe as a workaround, but you are on your own.
Win32 installers to use with mingw msys available for download at MinGW's sourceforge page: http://sourceforge.net/project/showfiles.php?group_id=23617
GMP & MPFR sources may be placed in the GCC source tree root in directories with their names and they will be built automatically by GCC's configure (as static libs). You might need to make install from inside the directories if GCC doesn't do it for you.
You need to download the following packages:
Official releases of GCC and binutils may be downloaded from a GNU FTP mirror from <http://www.gnu.org/prep/ftp.html>. GCC snapshots may be found at <ftp://gcc.gnu.org/pub/gcc/snapshots/>. Binutils snapshots may be found at <ftp://sourceware.org/pub/binutils/snapshots/>. Extract the tarballs (i.e. tar -xf filename.tar.gz) to a temporary folders.
You can also download the latest working version using SVN & CVS. Both source control systems are available to Cygwin via Setup, and available to MSys in the MSys/MinGW Packages. To use them:
When building binutils, GCC and Mingw-w64, you will be using standard autotools configure scripts. It is not a good idea to build in the source directory, so you will make a sibling directory next to the source tree, enter it, and invoke configure with '../path/to/configure' (which is then followed by 'make' and then 'make install'.) You will be providing options to the configure script, in the syntax of ../path/to/configure --flag[=setting]. This will be further detailed below.
Note: Do not build GCC in the source tree or in a subdirectory contained in source tree. This generally applies to many other autotools based packages too, unless specifically specified by the package developers or maintainers.
You have two main choices to make building the cross-compiler toolchain:
1) To build with default standard multilib (allows for building to a 32-bit alternate target, using Mingw-w64's lib32), or to disable multilib. Multilib is installed by default, if you don't want it, you have to explicitly disable it by passing --disable-multilib to configure, i.e.
../path/to/configure --disable-multilib
2) Using standard settings of configure, which installs to /usr/local and requires no setting changes, or to build to a sysroot you designate. /usr/local is universally used as the default install point, and you may wish to keep all the Mingw-w64 (64-bit) in a separate sysroot instead. In the example in these instructions, the sysroot is '/mypath'. To use a sysroot, pass --with-sysroot=/mypath and --prefix=/mypath as configure flags, i.e.
../path/to/configure --with-sysroot=/mypath --prefix=/mypath
Step 1) Create a build directory (e.g. 'build'), where binutils compiled object files will be stored. Then enter into it.
Step 2) Run configure.
For multilib:
../path/to/configure --target=x86_64-w64-mingw32 \
--enable-targets=x86_64-w64-mingw32,i686-w64-mingw32For non-multilib:
../path/to/configure --target=x86_64-w64-mingw32 \
--disable-multilibIf using a sysroot, add "--with-sysroot=/mypath --prefix=/mypath" to your configure command, i.e., for multilib:
../path/to/configure --target=x86_64-w64-mingw32 \
--enable-targets=x86_64-w64-mingw32,i686-w64-mingw32 \
--with-sysroot=/mypath --prefix=/mypath
Step 3) Run make (type 'make'). This will take a while.
Step 4) Run make install (type 'make install')
Step 5) You may optionally delete the "build" directory to save disk space.
Step 6) If you are using "--prefix" to install binutils to a directory not in your $PATH environmental variable, you should add the "bin" directory to you $PATH, i.e., for binutils installed to /home/luser/mingw64, use the following command to make new cross binutils visible by issuing:
export PATH="$PATH:/home/luser/mingw64/bin"
This step is required for building GCC later.
[HDRSYM] Step 1) The source directory for the headers can be mingw-w64/trunk/mingw-w64-headers, or mingw-w64/mingw-w64-headers depending on your source.
Step 2) Create another "build" directory, and enter it.
To install the headers, run:
../path/to/configure --build=<your build machine> \
--host=x86_64-w64-mingw32 --prefix=/mypathThen run "make install" to install the headers.
NOTE: For v3 (trunk as of writing, you MUST append x86_64-w64-mingw32 to your prefix, such as --prefix=/mypath/x86_64-w64-mingw32
NOTE: You MUST also do this for the CRT
Step 3) GCC requires the x86_64-w64-mingw32 directory be mirrored as a directory 'mingw' in the same root. So, if using configure default /usr/local, type:
ln -s /usr/local/x86_64-w64-mingw32 /usr/local/mingw
or, for sysroot, type:
ln -s /mypath/x86_64-w64-mingw32 /mypath/mingw
Step 4) Manually create the x86_64-w64-mingw32/lib directory:
mkdir -p /usr/local/x86_64-w64-mingw32/lib
or, for sysroot:
mkdir -p /mypath/x86_64-w64-mingw32/lib
If it already exists and you get an error, ignore it.
Step 5) Symlink x86_64-w64-mingw32/lib directory as x86_64-w64-mingw32/lib64:
ln -s /usr/local/x86_64-w64-mingw32/lib /usr/local/x86_64-w64-mingw32/lib64
or, for sysroot:
ln -s /mypath/x86_64-w64-mingw32/lib /mypath/x86_64-w64-mingw32/lib64
Note: On Windows systems or other systems that do not support UNIX type softlinks, you may copy the entire directory to mirror it. It will have the same effect as a symlink.
Note: The header-set and crt contains the standard-c and the windows platform headers. Therefore it is not necessary to install an additional package.
There are no GCC patches required anymore. We keep up with GCC and get any fixes applied upstream.
Step 1) Enter into the GCC root folder and generate a folder within (e.g. 'build'), then enter it.
Step 2) Run configure.
For multilib:
../path/to/configure --target=x86_64-w64-mingw32 --enable-targets=all
To disable multilib:
../path/to/configure --target=x86_64-w64-mingw32 --disable-multilib
Note: Remember to add the --prefix=/mypath and --with-sysroot=/mypath flags to match the binutils build if you are using a sysroot.
Step 3) Type 'make all-gcc'. This will build the GCC core.
Step 4) Type 'make install-gcc'. This will install the GCC core.
Step 5) You can leave the "build" directory alone for now, so you can resume building the rest of GCC later after installing the CRT.
Now the core stuff of GCC is present and we can build the crt itself.
Step 1) Create a new "build" directory for the crt. Enter the "build" directory.
Step 2) Run configure.
For multilib:
../path/to/configure --host=x86_64-w64-mingw32 --enable-lib32 (NOTE: This won't work if you disabled multilib!)
Without multilib:
../path/to/configure --host=x86_64-w64-mingw32
If using sysroot/prefix, again add the the --prefix=/mypath and --with-sysroot=/mypath flags.
NOTE: For v3 (trunk as of writing, you MUST append x86_64-w64-mingw32 to your prefix, such as --prefix=/mypath/x86_64-w64-mingw32 NOTE: You MUST also do this for the HEADERS
Step 3) Type make. This will take a while.
Step 4) Type make install
If you are performing this action on a system where sudo is used, the sudo make install may fail with an error about being unable to find x86_64-w64-mingw32-ranlib, because the PATH environment variable is not passed along to the root user.
You can work around this issue by creating a simple shell script in your build directory which updates PATH to include the location of x86_64-w64-mingw32-ranlib, e.g.:
1 2 3#!/bin/sh export PATH="$PATH:/usr/local/bin" make install
Then call that script with sudo instead.
Step 5) Make sure you have the following directories in the directory you have installed the mingw-w64 toolchain to:
<root>/x86_64-w64-mingw32
<root>/x86_64-w64-mingw32/include
<root>/x86_64-w64-mingw32/lib
<root>/x86_64-w64-mingw32/lib32
<root>/x86_64-w64-mingw32/lib64 [link to lib]
<root>/mingw [link to x86_64-w64-mingw32]
<root>/mingw/include
<root>/mingw/lib
<root>/mingw/lib32
<root>/mingw/lib64 [link to lib]
If you are using MSys/MinGW on Windows, remember to copy the "linked" directories to simulate the use of a symbolic link.
Note: For non-multilib builds, you can omit the "lib32" and "lib64" directories and only have "lib".
Note: Currently there are no dlls built. As long as we use static crt import libraries we won't need a ctor/dtor dll (mingwm10.dll).
Now you are ready to build the rest of GCC:
Step 1) Enter back into your GCC "build" directory.
Step 2) Type 'make'. This will take a while.
Step 3) Type 'make install'
Permanently update your path to use your new cross-compiler:
The binaries are all prefixed with the Mingw-w64 triplet x86_64-w64-mingw32-, so there are no file name clashes.
You are finished.
To use your cross-compiler, simply use --host=x86_64-w64-mingw32 as a configure option. Be sure to -I/usr/local/include or -I/mypath/include and -L/usr/local/lib or -L/mypath/lib to your CFLAGS to link your builds.
Often you must --enable-shared if you want DLLs as opposed to static libs, but it is not always the case.
Simply use the -mwindows option for windows GUI applications. By default, -mconsole is used and produce console applications. Also, you can use the -mdll option for generating shared objects (dll), however normal gcc/g++ with the -shared flag or a proper ld (linker) command will do this.