2023/12/30(土) [n年前の日記]
#2 [prog] MinGW上でzlibやlibpngをビルドしてみた
Windows10 x64 22H2 + MnGW (gcc 6.3.0) 上で、zlib と libpng をビルドしてみた。
OpenGL には画像ファイルを読み込む機能が無い。だから、png画像ファイルをテクスチャとして利用したい際は、何かしらの画像読み込みライブラリを持ってきてどうにかすることになる。そこで libpng を使って読み込む事例が多いように見えたので、そのあたりを使えるようにしておこうかなと…。
以下のページを参考にして作業させてもらった。ありがたや。
_zlib-1.2.7をMinGWでビルドする - 新・日々録 by TRASH BOX@Eel
_libpng-1.2.49、libpng-1.5.10をMinGWでビルドする - 新・日々録 by TRASH BOX@Eel
zlib のソースと libpng のソースを、以下から入手。
_zlib Home Site
_Index of /fossils
_libpng Home Page
_LIBPNG: PNG reference library - Browse Files at SourceForge.net
今回は、以下の2つのファイルを入手した。それぞれ解凍。
OpenGL には画像ファイルを読み込む機能が無い。だから、png画像ファイルをテクスチャとして利用したい際は、何かしらの画像読み込みライブラリを持ってきてどうにかすることになる。そこで libpng を使って読み込む事例が多いように見えたので、そのあたりを使えるようにしておこうかなと…。
以下のページを参考にして作業させてもらった。ありがたや。
_zlib-1.2.7をMinGWでビルドする - 新・日々録 by TRASH BOX@Eel
_libpng-1.2.49、libpng-1.5.10をMinGWでビルドする - 新・日々録 by TRASH BOX@Eel
zlib のソースと libpng のソースを、以下から入手。
_zlib Home Site
_Index of /fossils
_libpng Home Page
_LIBPNG: PNG reference library - Browse Files at SourceForge.net
今回は、以下の2つのファイルを入手した。それぞれ解凍。
zlib13.zip libpng-1.6.40.tar.xz
◎ zlibをビルド :
libpng は zlib を使って処理をするので、まず最初に zlib をビルドする必要がある。
解凍したフォルダ内をカレントディレクトリにして、make を実行。MinGW用の Makefile は無いけれど、gcc 用のソレが利用できるらしい。
以下のファイルができるので、MinGW をインストールしたフォルダにコピーする。
それぞれを以下のディレクトリにコピーすればいい。たぶん。
libz.dll.a があるとそちらを優先して使われて動的リンクになるという話を見かけたので、libz.dll.a を libz.dll.a.esc にリネームしておいた。
解凍したフォルダ内をカレントディレクトリにして、make を実行。MinGW用の Makefile は無いけれど、gcc 用のソレが利用できるらしい。
make -f win32/Makefile.gcc
以下のファイルができるので、MinGW をインストールしたフォルダにコピーする。
zlib1.dll zconf.h zlib.h libz.a libz.dll.a
それぞれを以下のディレクトリにコピーすればいい。たぶん。
- .dll は bin/ に。
- .h は include/ に。
- .a は lib/ に。
libz.dll.a があるとそちらを優先して使われて動的リンクになるという話を見かけたので、libz.dll.a を libz.dll.a.esc にリネームしておいた。
◎ libpngをビルド :
これも解凍したフォルダの中で make を走らせる。
以下のファイルができるので、MinGW のフォルダにコピー。.h は include/ に。.a は lib/ に。
ちなみに、gcc で libpng を使ったプログラムをビルドしたい時は、オプションとして -lpng -lz をつけてリンカに指示してやるらしい。-lxxxx と指定すると、自動で頭に lib をつけて、libxxxx をリンクしてくれるそうで。つまり、-lpng -lz は、libpng、libz をリンクせよという指示になる。
make -f scripts/makefile.gcc
以下のファイルができるので、MinGW のフォルダにコピー。.h は include/ に。.a は lib/ に。
png.h pngconf.h pngdebug.h pnginfo.h pnglibconf.h pngpriv.h pngstruct.h libpng.a
ちなみに、gcc で libpng を使ったプログラムをビルドしたい時は、オプションとして -lpng -lz をつけてリンカに指示してやるらしい。-lxxxx と指定すると、自動で頭に lib をつけて、libxxxx をリンクしてくれるそうで。つまり、-lpng -lz は、libpng、libz をリンクせよという指示になる。
◎ zlib自体はパッケージがある :
MinGW の場合、libpng は無いけれど、zlib 自体はパッケージが存在しているっぽい。libz、もしくは zlib という名前で、dev がついているのがソレ。
ただ、バージョンが古い。一応セキュリティホール云々の話もありそうなので、MinGWインストールフォルダ内の、公式パッケージ版の各ファイルをリネームして、今回ビルドしたファイルをコピーして使うことにした。
libz-1.2.11-1-mingw32-dev.tar.xz zlib-1.2.8-1-mingw32-dev.tar.lzma
ただ、バージョンが古い。一応セキュリティホール云々の話もありそうなので、MinGWインストールフォルダ内の、公式パッケージ版の各ファイルをリネームして、今回ビルドしたファイルをコピーして使うことにした。
◎ libpngを使ったプログラムをビルドできるかテスト :
以下で紹介されているプログラムをコピペさせてもらって、MinGW (gcc 6.3.0)上で libpng を使ったプログラムをビルドできるのか試してみた。
_【C言語】libpngのインストールと使用方法・使用例 | だえうホームページ
_main.c
_input.png
Makefile は以下のような感じ。
_Makefile
make と打ってビルド。png.exe が生成された。
png.exe input.png と打ち込んだら、グレー画像になった _output.png が得られた。今回ビルドした libpng は、それらしく動作してるっぽい。
_【C言語】libpngのインストールと使用方法・使用例 | だえうホームページ
_main.c
_input.png
Makefile は以下のような感じ。
_Makefile
png.exe: main.c gcc main.c -o png.exe -static -lpng -lz .PHONY: clean clean: rm -f png.exe
- main.c から png.exe を作ってる。
- -lpng -lz を指定して、libpng と libz をリンクせよと指定している。
- -static をつけて、静的リンク(static link)をしている。
make と打ってビルド。png.exe が生成された。
png.exe input.png と打ち込んだら、グレー画像になった _output.png が得られた。今回ビルドした libpng は、それらしく動作してるっぽい。
◎ 余談。MSYS2でlibpngをインストール :
MSYS2なら、zlib も libpng もパッケージとして用意されているので、pacman でインストールできる。
2023/12/30時点では以下がインストールされた。
pacman -S mingw-w64-x86_64-zlib pacman -S mingw-w64-i686-zlib pacman -S mingw-w64-x86_64-libpng pacman -S mingw-w64-i686-libpng
2023/12/30時点では以下がインストールされた。
mingw64/mingw-w64-x86_64-zlib 1.3-1 mingw32/mingw-w64-i686-zlib 1.3-1 mingw64/mingw-w64-x86_64-libpng 1.6.40-1 mingw32/mingw-w64-i686-libpng 1.6.40-1
[ ツッコむ ]
以上です。