domingo, 25 de octubre de 2009

Compilar para Windows desde Ubuntu (II)

En vez de traernos los ejecutables necesarios para la compilación cruzada, podemos traernos los fuentes, y compilarlos.
La ventaja es que podemos tener la última versión, y compilarlos para exactamente la CPU que tengamos (en mi caso, CFLAGS=-march=pentium-m).

Adaptado de la receta de Ramiro.

Nos instalamos algunas dependencias de gcc:
sudo apt-get install flex bison

Algunas dependencias de FFmpeg.
sudo apt-get install texinfo yasm subversion

Y un entorno para poder testear los ejecutables de Windows, sin salir de Linux:
sudo apt-get install wine

Nos preparamos un directorio para bajarnos y compilar el código fuente:
cd "$HOME"
mkdir src
export BASE_PATH="$HOME/src"


Traemos estos ficheros, y los dejamos en el directorio $BASE_PATH:
binutils-2.20.tar.bz2
gcc-core-4.2.4.tar.bz2
mingwrt-3.16-mingw32-dev.tar.gz (from http://sourceforge.net/projects/mingw/files/ under "MinGW Runtime")
w32api-3.13-mingw32-dev.tar.gz (from same site as above under "MinGW API for MS-Windows")
zlib-1.2.3.tar.gz (from http://prdownloads.sourceforge.net/libpng/ )
bzip2-1.0.5.tar.gz (from http://bzip.org/downloads.html )

El compilador cruzado lo instalamos en /usr. Pondrá su cosillas en /usr/bin/i686-mingw32*, sin machacar las del compilador nativo de Ubuntu (que son /usr/bin/i486-linux-gnu*).

Importante:
sudo ln -s /usr/i686-mingw32 /mingw

binutils:
cd "$BASE_PATH"
tar xfvj binutils-2.20.tar.bz2
cd binutils-2.20
mkdir build
cd build
../configure --target=i686-mingw32 --disable-werror --disable-nls --prefix=/usr
make
sudo make install


"runtime" de MinGW:
cd "$BASE_PATH"
sudo tar zxfv mingwrt-3.16-mingw32-dev.tar.gz -C /mingw
sudo tar zxfv w32api-3.13-mingw32-dev.tar.gz -C /mingw


compilador de C:
cd "$BASE_PATH"
tar xfvj gcc-core-4.2.4.tar.bz2
cd gcc-4.2.4
mkdir build
cd build
CFLAGS=-march=pentium-m ../configure --target=i686-mingw32 --disable-nls --prefix=/usr
make
sudo make install


En los entornos GNU, la manera de indicar que queremos usar compilación cruzada, en vez de nativa, es a través de las variables de entorno:
RANLIB=i686-mingw32-ranlib AR=i686-mingw32-ar CC=i686-mingw32-gcc

Compilamos para MinGW algunas bibliotecas de funciones:

zlib:
cd $BASE_PATH
tar zxfv zlib-1.2.3.tar.gz
cd zlib-1.2.3
CFLAGS=-march=pentium-m RANLIB=i686-mingw32-ranlib AR="i686-mingw32-ar rc" CC=i686-mingw32-gcc ./configure --prefix=/mingw
make
sudo make install


bzip2:
cd "$BASE_PATH"
tar zxfv bzip2-1.0.5.tar.gz
cd bzip2-1.0.5
make libbz2.a CFLAGS=-march=pentium-m RANLIB=i686-mingw32-ranlib AR=i686-mingw32-ar CC=i686-mingw32-gcc
sudo cp bzlib.h /mingw/include/
sudo cp libbz2.a /mingw/lib/


Y con esto ya podemos compilar un FFmpeg para MinGW. Aquí la compilación cruzada se indica con --cross-prefix=i686-mingw32- --target-os=mingw32 y la CPU con --arch=pentium-m --cpu=pentium-m:
cd "$BASE_PATH"
mkdir ffmpeg
cd ffmpeg
svn co svn://svn.ffmpeg.org/ffmpeg/trunk svn
mkdir build-win32
cd build-win32
../svn/configure --enable-memalign-hack --cross-prefix=i686-mingw32- --target-os=mingw32 --arch=pentium-m --cpu=pentium-m


Y os preguntaréis, ¿por qué no compilar para MinGW desde MinGW?. Pues porque es más lento. Pero no un poco, sino algo exagerado: diez veces más lento.

1 comentario:

  1. hola no se si el que escribio esto segira mirando este apartado y si alguien ve mi comentario y sabe como hacerlo k m lo escriba bueno empecemos:
    tengo linux ubuntu todos mis ordenadores son de linux sea ubuntu xubuntu u otros bale ize un pekeño programa en c pero mi ordenador con linux tengo el codigo fuente y el ejecutable pero kiero compartirlo el problema esta en k mis amigos utilizan windows y lo k kiero acer es pasar mi programa a windows lo compile con gcc y cuando guardo el archivo hecho en gcc pulso ctrl+o y aparece para k guardar y en un rincon dice para windos escribe M-D nada guardo el archivo s guarda prog.cMD y lo compilo
    lo pruebo en windows y no no funciona

    ResponderEliminar