ZYNQ上のLinuxでPNG画像を生成する
ZYNQ上でPNGの画像を生成するには、libpngというライブラリが必要です。
パソコンのLinuxで動くlibpngならバイナリがいくらでもダウンロードできますが、ZYNQのLinuxで動くものなどそう簡単にはありません。
だから、libpngは自分でビルドします。
①
まず、デスクトップPCのLinux上にXILINXのSDKを入れたら、
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
source /opt/Xilinx/SDK/2013.2/settings32.sh
でパスを通します。
② zlib
libpngを作るにはzlibが必要です。zlibはPNGで使われる圧縮形式です。
まず、zlibをとってきます。
http://www.zlib.net/
のページの真ん中ほどにあります。
http://zlib.net/zlib-1.2.8.tar.gz
これを解凍し
gunzip zlib-1.2.8.tar.gz
tar -xvf zlib-1.2.8.tar
cd zlib-1.2.8
ビルドします。
export CC=arm-xilinx-linux-gnueabi-gcc
として、
./configure --prefix=/usr/local/arm-linux
make
で通ります。
できあがったら、
sudo make install
で/usr/local/arm-linux/includeにヘッダファイル類が、/usr/local/arm-linux/libにライブラリのバイナリがインストールされます。
これは問題なく通ると思います。
③libpng
libpngはPNGファイルを作るライブラリです。libpngは1.6.16が最新版ですが、configureファイルがなく設定がよくわからないので、古いバージョン 1.2.52 を使います。
下記のURLからダウンロードしてきます。
http://sourceforge.net/projects/libpng/files/libpng12/1.2.52/
configureするときに、いろいろなオプションが必要です。NEONの命令を生成するなどこちらのページを参考にしました。
./configure --host=arm-xilinx-linux-gnueabi CC=arm-xilinx-linux-gnueabi-gcc AR=arm-xilinx-linux-gnueabi-ar STRIP=arm-xilinx-linux-gnueabi-strip RANLIB=arm-xilinx-linux-gnueabi-ranlib CPPFLAGS="-mfpu=neon -I/home/naitou/libpng/zlib-1.2.8/" LDFLAGS="-L/home/naitou/libpng/zlib-1.2.8/ prefix=/usr/local/arm-linux
make
でライブラリが作成され、
make install
でインストールされます。 私の環境ではなぜかranlibが最後まで動かなかったので、いくつかのファイルは手動でコピーしました。
④テストプログラムを作る
libpngのプログラムは、
http://www.cnx-software.com/2011/10/06/cross-comping-zlib-for-arm-target/
のページを参考にして作るのが一番簡単だと思います。
arm-xilinx-linux-gnueabi-gcc -I/usr/local/arm-linux/include test.c -o test.cgi -L/usr/local/arm-linux/lib -lpng -lz
でコンパイルできます。
できあがった、test.cgiを、ZYNQのボードの/var/www/cgi-binに置き、パーミッションを755に設定します。
⑤ .soのインストール
-lpngでビルドすると、シェアードオブジェクトのほうをリンクします。
コンパイルに使ったローカルPCの、/usr/local/arm-linux/libにlibpng.so.3.52.0というファイルができているので、これをZYNQのボードの/usr/lib/に置き、
ln -s /usr/lib/libpng.so.3.52.0 /usr/lib/libpng.so.3
ln -s /usr/lib/libpng.so.3.52.0 /usr/lib/libpng.so
でシンボリックリンクを作っておきます。これがないと、ldがエラーを出してしまいます。
ダイナミックリンクをせずにスタティックな実行ファイルを作るには-lpngではなく、-lpng12にするようです。そうすれば、libpng12.aのほうがリンクされるので実行時に.soは必要ありません。
ただ、私の環境ではranlibが失敗したとかでエラーがでているので、そのせいかもしれません。
これでCGIでPNG画像を作って返せるようになります。
| 固定リンク



コメント