初版: 2002/12/31
最終更新日:
2003/02/10
#includeという非常に簡単なものです。 これをとりあえず、 hello.cという名前で保存します。main() { printf("Hello, Embedix\n"); }
クロスコンパイラは、 「クロスコンパイラインストール編」 に書いたように、 /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc にあります。 そこで、
% /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc hello.cのようにコンパイルしました。
もちろん、環境変数$PATHに /compat/linux/opt/Embedix/tools/binを追加してあれば、
% arm-linux-gcc hello.cでもかまいません。 まぁ、しょっちゅう使うわけでもないので、 毎回、絶対パス指定で使うことにしました。
できあがったファイル (a.out) のファイル形式をテストすると、
% file a.out a.out: ELF 32-bit LSB executable, ARM, version 1 (ARM), dynamically linked (uses shared libs), not strippedちゃんとARM用バイナリができています:-)
最後に、できあがったファイルを、ネットワーク経由なり、 CFメモリカードかSDメモリカードを使ってSLザウルスにうつして実行してみます。 ネットワーク経由のコピーでは、SLザウルス側でftpを使うのが簡単でしょう。 メモリカードの場合は、 CFカードは/usr/mnt.rom/cf/に、 SDカードは/usr/mnt.rom/card/にマウントされるようです。
SLザウルスにファイルをうつして実行したときのスクリーンショットを以下に。
「pdxmem v0.0」のコンパイルには、 「ppm v0.2」と 「hpb v0.0」のソースが必要です。 これらのソースを適当なディレクトリでソースを展開します。
% lha xet ppm02.lzh % lha x hpb00.lzh hpbsrc.lzh % lha xetf hpbsrc.lzh % lha xetf pdxmem00.lzh % patch -p1 < patch.difこれでソースの準備ができました。 次にメイクファイルを作成します。
% cpp -DGCCUNIX makefile.cpp > makefileここで作成したメイクファイルはクロスコンパイル向けではないので、 「CC=gcc」を変更してクロスコンパイル向けのものを作成します。 これは、viなどのエディタを使って、 当該行を「CC=gcc」から 「CC=/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc」 に手で変更しても構いませんし、コマンドラインからsedを使って
% mv makefile makefile.bak % sed 's+CC=gcc+CC=/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc+' < makefile.bak > makefileとしてもいいでしょう。 メイクファイルができたらあとはmakeするだけです。
% make /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -c -DEUC -Wall pdxmem.c pdxmem.c:521: warning: return type of `main' is not `int' /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -c -DEUC -Wall chat.c /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -c -DEUC -Wall tty.c /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -o pdxmem pdxmem.o chat.o tty.oこんな感じでコンパイルできます。
さて、ここまでで「Hello, world」と「pdxmem」をコンパイルしてみましたが、 もうすこし複雑な例として、日本語エディタ「Ng-1.4.3」をコンパイルしてみます。 「Ng」はemacs互換の軽快なエディタです。 いろんな環境での動作実績があります。
まず、ソース一式 (ng-1.4.3.tar.gz) を用意して、 これを展開します。
% tar xzvf ng-1.4.3.tar.gz % cd ng次にドキュメントを熟読します。
% more docs/README.Ngコンパイルの手順がわかったところで、 メイクファイルの準備をします。 ドキュメントではln(1)を使ってますが、安易にcpします。
% cp sys/sysv/Makefile .次に、メイクファイル中のコンパイラの指定を変更しておきます。 「CC」行の右辺を「gcc」から 「/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc」にします。 ここでmakeを実行すると、
% make rm -f ttydef.h ln sys/default/ttydef.h . rm -f sysdef.h ln sys/sysv/sysdef.h . rm -f chrdef.h ln sys/default/chrdef.h . /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -O -c basic.cのようにコンパイルが始まります。しかし、しばらくすると、
/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -O -c canna.c /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -O -o ng basic.o dir.o dired.o shell.o version.o window.o kinsoku.o jump.o buffer.o complt.o display.o cmode.o echo.o extend.o file.o help.o kbd.o keymap.o line.o macro.o main.o match.o modes.o paragraph.o random.o region.o regex.o re_search.o search.o skg.o kanji.o undo.o word.o cinfo.o spawn.o ttyio.o tty.o ttykbd.o fileio.o canna.o -lcurses /opt/Embedix/tools/arm-linux/bin/ld: cannot find -lcurses collect2: ld returned 1 exit status *** Error code 1 Stop in /tmp/ng.となり、実行ファイルを作成するところまでいきません。
これは、cursesライブラリのリンクに失敗していることが原因です。 そこで、SLザウルスから「libncurses.so」をコピーして カレントディレクトリに置きます。 さらにMakefileを変更して、「LIBS」行の 「-lcurses」を「-lncurses -L.」とします。 変更部分はメイクファイルの差分 (makefile.patch) を参照してください。
さて、以上のとおり、「CC」と「LIBS」を変更したMakefileを使うと 無事コンパイルすることができます。
ちなみに実行形式は ここ (ng-binary-for-sl-zaurus.tgz) です。