Manual for cross-compiling a C++ application from Linux to Windows?

34,772

Solution 1

The basics are not too difficult:

sudo apt-get install mingw32    
cat > main.c <<EOF
int main()
{
  printf("Hello, World!");
}
EOF
i586-mingw32msvc-cc main.c -o hello.exe

Replace apt-get with yum, or whatever your Linux distro uses. That will generate a hello.exe for Windows.

Once you get your head around that, you could use autotools, and set CC=i586-mingw32msvc-cc

CC=i586-mingw32msvc-cc ./configure && make

Or use CMake and a toolchain file to manage the build. More difficult still is adding native cross libraries. Usually they are stored in /usr/cross/i586-mingw32msvc/{include,lib} and you would need to add those paths in separately in the configure step of the build process.

Solution 2

It depends on what you mean (I couldn't really say).

  1. If you mean that you want to use an existing Linux application on Windows, then you could try compiling it using Cygwin on Windows. This however does not give you a Windows executable free from all dependencies towards Cygwin (your executable still depends on the cygwin.dll file) - and it still may need some porting before it will work. See http://www.cygwin.com.

  2. If you mean that you want to be able to perform the actual compilation of a Windows application on Linux and produce a .exe file that is executable on Windows - thus using your Linux box for development and/or compilation then you should look into MinGW for Linux which is a tool for crosscompiling for Windows on Linux. See http://www.mingw.org/wiki/LinuxCrossMinGW.

Best regards!

Solution 3

I suggest you give the following, GUB (Grand Unified Builder) a try as it cross-compiles several packages with their dependencies and assembles them into a single installation package for currently 11 architectures. You can download a prebuilt iso for installation in a VM from here and follow the source here. It can currently be used to cross-compile GNU LilyPond/ GNU Denemo / Inkscape and OpenOffice.org.

The target architectures are:

  • darwin-ppc - tar.bz2 file for Darwin 7 (MacOS 10.3)/PowerPC
  • darwin-x86 - tar.bz2 file for Darwin 8 (MacOS 10.4)/x86
  • mingw - mingw executable for Windows32
  • linux-x86 - shar archive for Linux/x86
  • linux-64 - shar archive for Linux/x86_64
  • linux-ppc - shar archive for Linux/PowerPC
  • freebsd-x86 - shar archive for FreeBSD 4/x86
  • freebsd-64 - shar archive for FreeBSD 6/x86_64
  • cygwin - .tar.bz2 packages for Cygwin/Windows32
  • arm - shar archive for Linux/ARM (largely untested)
  • debian - shar archive for Debian (largely untested)
Share:
34,772
Pablo Herrero
Author by

Pablo Herrero

Software Development Engineer, Business Software Developer

Updated on February 07, 2020

Comments

  • Pablo Herrero
    Pablo Herrero about 4 years

    Is there a manual for cross-compiling a C++ application from Linux to Windows?

    Just that. I would like some information (links, reference, examples...) to guide me to do that.

    I don't even know if it's possible.

    My objective is to compile a program in Linux and get a .exe file that I can run under Windows.

  • Branan
    Branan over 15 years
    One thing to note with this is that some libraries don't like to cross-compile. If your only choices are an .exe installer and source, you may want to install the library under wine and then copy the libraries and headers into your mingw search path. I never could get Boost to cross-compile
  • NawaMan
    NawaMan over 14 years
    Would you mind guide me to how can I test such compiled program with Wine?
  • Ben Moss
    Ben Moss over 14 years
    wine hello.exe should do it!
  • namuol
    namuol about 11 years
    WINE is okay for stupid-simple programs like this, but a VM (VirtualBox, VMWare, QEMU, etc) is your best bet.
  • chus
    chus over 7 years
    If you want to generate a 64-bit Windows binary, install the 64-bit tools: $ sudo apt-get install mingw-w64. The compiler is x86_64-w64-mingw32-gcc.