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.
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;
}
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
On va se servir des compilateurs mingw
dnf install mingw32-gcc mingw32-gcc-c++ mingw32-binutils mingw64-gcc mingw64-gcc-c++ mingw64-binutils
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 .
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 .