Linux(Ubuntu)を使ってCygwin向けのバイナリをクロスコンパイルしました。Cygwinでビルドすると遅いし、CPUファンがうるさいのでサーバー側でコンパイル仕掛けて静か寝られる方がうれしい。何よりLinuxでやった方がCygwinでコンパイルするより3倍以上速い気がする。Cygwinコンパイルは遅い。
準備
sudo aptitude install flex #lexを入れる sudo aptitude install lib32gmp3-dev # gmp が必要らしい export PREFIX=/home/takuya/build/cygwin #prefix を決める mkdir -p $PREFIX #cygwin のヘッダファイルとか wget http://ftp.jaist.ac.jp/pub/cygwin/release/cygwin/cygwin-1.7.8-1.tar.bz2 wget http://ftp.jaist.ac.jp/pub/cygwin/release/mingw-runtime/mingw-runtime-3.18-1.tar.bz2 wget http://ftp.jaist.ac.jp/pub/cygwin/release/w32api/w32api-3.17-1.tar.bz2 tar fjx cygwin-1.7.8-1.tar.bz2 usr/include usr/lib tar jxf mingw-runtime-3.18-1.tar.bz2 tar jxf w32api-3.17-1.tar.bz2 mv usr/include usr/lib ${PREFIX}/i686-pc-cygwin
binutilsを作る
wget http://core.ring.gr.jp/archives/GNU/binutils/binutils-2.19.1.tar.bz2 tar jxvf binutils-2.19.1.tar.bz2 cd binutils-2.19.1 ./configure --prefix=${PREFIX} --target=i686-pc-cygwin make make install export PATH=${PREFIX}/bin:${PATH} #クロスコンパイルのインストール先へパスを通す
クロスコンパイル用のgccを作る
cd .. wget ftp://ftp.dti.ad.jp/pub/lang/gcc/releases/gcc-4.5.2/gcc-4.5.2.tar.bz2 tar jxf gcc-4.5.2.tar.bz2 cd gcc-4.5.2 mkdir obj-gcc cd obj-gcc ../configure --target=i686-pc-cygwin\ --prefix=$PREFIX \ --with-newlib \ --enable-languages=c,c++ make #じっと待つ。 make install
出来た!!!
compile してみる
echo " #include <stdio.h> int main() { printf("hello world\n"); } " > test.c i686-pc-cygwin-gcc test.c -o test.exe
出来た。動いた。Windowsにファイルを転送してチェックしてみる
Windows側でチェック
takuya@letsnote:~$ cygcheck.exe ./test.exe C:\Users\takuya\test.exe C:\Windows\system32\KERNEL32.dll C:\Windows\system32\API-MS-Win-Core-RtlSupport-L1-1-0.dll (略) C:\Users\Public\apps\cygwin\bin\cygwin1.dll (略)
クロスコンパイル出来たよ。
以前やったtreeコマンドを作ってみる
以前Cygwin側でコンパイルしたTreeコマンドを、今度はUbuntuからCygwin向けにコンパイルしてみる。
wget http://tree.sourcearchive.com/downloads/1.5.3-1/tree_1.5.3.orig.tar.gz tar zxvf tree_1.5.3.orig.tar.gz cd tree-1.5.3
コメントアウトを解消して・・・
Makefile
> 38 # Uncomment for Cygwin: > 39 CFLAGS=-O2 -Wall -fomit-frame-pointer -DCYGWIN > 40 LDFLAGS=-s > 41 TREE_DEST=tree.exe > 42 XOBJS=strverscmp.o
ビルドしてみる
make prefix=$PREFIX CC=i686-pc-cygwin-gcc ##cc はMakefile見ながら考えた
あっけないほどに出来た
Cygwin(Windows側)でコマンドを実験してみる
takuya@ubuntu:~$ scp 192.168.2.5:/home/takuya/tree-1.5.3/tree.exe . takuya@ubuntu:~$ tree ├── 2011-03-11 PEAR(Windows版)を入れるとエラーになる。.txt ├── 2011-03-11 php syntax エラーが表示されない.txt ├── 2011-03-12 OpenCVインストール.txt ├── COMを探す方法 │   ├── WS000310.JPG │   ├── WS000311.JPG │   ├── WS000312.JPG │   ├── WS000313.JPG │   ├── WS000330.JPG │   └── WS000331.JPG
コレもまた簡単に動いた。クロスコンパイル環境は意外と便利ですね。