MinGW/Tutorial

From FedoraProject

Jump to: navigation, search

Contents

Introduction

As of Fedora 17 it is possible to easily build (cross-compile) binaries for the win32 and win64 targets. This is realized using the mingw-w64 toolchain: http://mingw-w64.sf.net/. Using this toolchain allows you to build binaries for the following programming languages: C, C++, Objective-C, Objective-C++ and Fortran.


Infrastructure

To be able to build binaries for the win32 or win64 targets you need to install some packages using yum or the graphical software installer.

Here's a chart indicating which packages provide which functionality:

Win32 Win64
C compiler mingw32-gcc mingw64-gcc
C++ compiler mingw32-gcc-c++ mingw64-gcc-c++
ObjC compiler mingw32-gcc-objc mingw64-gcc-objc
ObjC++ compiler mingw32-gcc-objc++ mingw64-gcc-objc++
Fortran compiler mingw32-gcc-gfortran mingw64-gcc-gfortran

Once you've installed one (or more) of these packages you should have a new folder on your filesystem called /usr/i686-w64-mingw32/sys-root/mingw (for win32) or /usr/x86_64-w64-mingw32/sys-root/mingw (for win64). These folders contain various pieces belonging to the mingw-w64 toolchain, for example the headers belonging to the Windows API and the import libraries for the default Windows API libraries (like shell32.dll and winsock2.dll).


Compiling code

Now that you've installed a compiler it's time to use it. See the following chart to find out what command you should use to run the compiler:

C compiler
win32 i686-w64-mingw32-gcc
win64 x86_64-w64-mingw32-gcc
C++ compiler
win32 i686-w64-mingw32-g++
win64 x86_64-w64-mingw32-g++
ObjC compiler
win32 i686-w64-mingw32-gcc
win64 x86_64-w64-mingw32-gcc
ObjC++ compiler
win32 i686-w64-mingw32-g++
win64 x86_64-w64-mingw32-g++
Fortran compiler
win32 i686-w64-mingw32-gfortran
win64 x86_64-w64-mingw32-gfortran

So if you want to compile a .cpp file and make it an executable for the win64 target, then you could using this command:

 x86_64-w64-mingw32-g++ main.cpp -o my_project.exe

For a full list of all command line arguments which are supported by the various compilers, you can check out their man-pages, for example:

 man x86_64-w64-mingw32-g++


Building autoconf-based projects

Most open source projects are using the autoconf infrastructure (./configure; make; make install). This type of projects can be built very easily for the win32 or win64 targets. Just install one of the compiler packages mentioned earlier and replace ./configure with either 'mingw32-configure' or 'mingw64-configure' (depending whether you want to build for the win32 or the win64 target). The mingw32-configure and mingw64-configure scripts are helper scripts which automatically call the ./configure script with the correct environment set

Once the mingw32-configure/mingw64-configure call has completed, you can call 'make' and 'make install' just as you would usually do to build and install a package

It is also possible to pass additional arguments to the mingw32-configure/mingw64-configure calls, for example:

 mingw64-configure --enable-foo --disable-bar

When using the mingw32-configure/mingw64-configure scripts, the files belonging to the package in question will automatically be installed to either /usr/i686-w64-mingw32/sys-root/mingw or /usr/x86-64-w64-mingw32/sys-root/mingw when you run 'make install'. That way you can keep all cross-compiled libraries and executables in one central location


Building CMake-based projects

Another popular build system is CMake. Like with the mingw32-configure/mingw64-configure scripts we've also made it easy to build packaging using CMake. For this, you need to have the cmake package installed first. Then you can use the mingw32-cmake or mingw64-cmake commands to run CMake with the correct environment set for the given target. Once the mingw32-cmake/mingw64-cmake command has completed, just use 'make' and 'make install'


Building Qt4-qmake-based projects

The Qt project also has written a build system called qmake (actually: qmake-qt4). This build system is used by various packages which are Qt based. For this build system we've also prepared tools to make cross-compilation for the win32 and win64 targets easy. Just install the packages mingw32-qt-qmake or mingw64-qt-qmake. Once these are installed you can execute the command i686-w64-mingw32-qmake-qt4 or x86_64-w64-mingw32-qmake-qt4 followed by 'make' and 'make install'


Writing .spec files

All the helper scripts which are mentioned earlier can also be used when building RPMS using a .spec file. To find out more about writing .spec files to build cross-compiled packages you should take a look at the Fedora MinGW packaging guidelines: https://fedoraproject.org/wiki/Packaging:MinGW This set of guidelines also contains an example .spec file