Cross Compilation - Premiers pas

compilation cross-compilation

Pour générer un exécutable windows depuis linux, il faut recourir à ce qu'on appelle la cross-compilation: compiler sur un système pour un autre système.

On va partir d'un simple "Hello world".

A ce propos, j'ai découvert une collection d'hello world sur Github.

Sources

Le fichier source en C sera main.c

#include<stdio.h>
int main()
{
  printf("Hello World !n");
  return 0;
}

Le fichier source en C++ sera main.cpp

#include <iostream>
using namespace std;
int main()
{
  cout << "Hello World !" << endl;
  return 0;
}

Compilation

GNU/Linux

Pour GNU/Linux, le fichier C serait compilé avec la commande

gcc -O0 -Wall -g -o helloc main.c

et le fichier C++

g++ -O0 -Wall -g -o hellocpp main.cpp

Wind@uze

On va se servir des compilateurs mingw

dnf install mingw32-gcc mingw32-gcc-c++ mingw32-binutils mingw64-gcc mingw64-gcc-c++ mingw64-binutils

Version 32 bits

le fichier C sera compilé avec la commande

i686-w64-mingw32-gcc -O0 -Wall -g -o helloc32.exe main.c

et le fichier C++

i686-w64-mingw32-g++ -O0 -Wall -g -o hellocpp32.exe main.cpp

En testant le binaire généré à partir du C++ avec wine, on se rend compte qu'il ne fonctionne pas (absence de DLLs).

err:module:import_dll Library libstdc++-6.dll (which is needed by L"V:hello32.exe") not found

Pour résoudre ce problème, il va falloir copié quelques DLLs dans le même répertoire que l'exécutable

cp /usr/i686-w64-mingw32/sys-root/mingw/bin/libstdc++-6.dll .
cp /usr/i686-w64-mingw32/sys-root/mingw/bin/libgcc_s_sjlj-1.dll .
cp /usr/i686-w64-mingw32/sys-root/mingw/bin/libwinpthread-1.dll .

Version 64 bits

le fichier C sera compilé avec la commande

x86_64-w64-mingw32-gcc -O0 -Wall -g -o helloc64.exe main.c

et le fichier C++

x86_64-w64-mingw32-g++ -O0 -Wall -g -o hellocpp64.exe main.cpp

Pour résoudre le même problème que la version 32 bits, il va falloir copié quelques DLLs dans le même répertoire que l'exécutable.

cp /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libstdc++-6.dll .
cp /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libgcc_s_seh-1.dll .
cp /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libwinpthread-1.dll .

Article précédent Article suivant