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.