2023/12/30(土) [n年前の日記]
#1 [prog] MinGWのSourceForge版を再インストールした
先日、Windows10 x64 22H2上で、OSDN配布版の MinGW をインストールしたのだけど。その後やっぱり OSDN が不安定過ぎて必要なパッケージがDLできない状態に遭遇してしまった。さすがにコレは厳しい。
そんなわけで、SourceForge で配布されてる MinGW をインストールし直すことにした。
SourceForge配布版の MinGW はサクサクとDLできて、スンナリとインストールできた。ただ、OSDN版に比べると、各パッケージのバージョンが古い。例えば、Cコンパイラの gcc も以下のような違いがある。
もっとも、フツーに使うなら今時は MSYS2 を選択するだろうし…。自分の場合、スクリーンセーバ用ライブラリを使いたいから MinGW を選んでる感じなので…。MSYS2 でもスクリーンセーバ用ライブラリ (libscrnsave.a, libscrnsavw.a) が使えるなら助かるのだけど…。
そんなわけで、SourceForge で配布されてる MinGW をインストールし直すことにした。
SourceForge配布版の MinGW はサクサクとDLできて、スンナリとインストールできた。ただ、OSDN版に比べると、各パッケージのバージョンが古い。例えば、Cコンパイラの gcc も以下のような違いがある。
- OSDN版 gcc は 9.2.0
- SourceForge版 gcc は 6.3.0
もっとも、フツーに使うなら今時は MSYS2 を選択するだろうし…。自分の場合、スクリーンセーバ用ライブラリを使いたいから MinGW を選んでる感じなので…。MSYS2 でもスクリーンセーバ用ライブラリ (libscrnsave.a, libscrnsavw.a) が使えるなら助かるのだけど…。
[ ツッコむ ]
#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
[ ツッコむ ]
#3 [prog] libpngを使ってOpenGLのテクスチャを用意できるか試した
Windows10 x64 22H2 + MinGW (gcc 6.3.0) 上で、OpenGL を使ってテクスチャを表示したい。OpenGL には画像を読み込む機能が無いので、libpng を使ってpng画像を読み込んで、OpenGL のテクスチャにできるのか試してみた。
以下のページがとても参考になった。ありがたや。
_PNGファイルをOpenGLで扱う話
紹介されてるサンプルプログラムをほとんどそのままコピペさせてもらって、MinGW (gcc 6.3.0) 上でもビルドして動かせるか試してみた。
以下のページがとても参考になった。ありがたや。
_PNGファイルをOpenGLで扱う話
紹介されてるサンプルプログラムをほとんどそのままコピペさせてもらって、MinGW (gcc 6.3.0) 上でもビルドして動かせるか試してみた。
◎ 必要なライブラリ :
今回試すプログラムのビルドには、freeglut、zlib、libpng が必要。
MinGW に freeglut を導入する手順は、以前メモしてあった。
_mieki256's diary - MinGWでfreeglutを使ってみた
zlib と libpng の導入手順は以下。
_mieki256's diary - MinGW上でzlibやlibpngをビルドしてみた
MinGW に freeglut を導入する手順は、以前メモしてあった。
_mieki256's diary - MinGWでfreeglutを使ってみた
zlib と libpng の導入手順は以下。
_mieki256's diary - MinGW上でzlibやlibpngをビルドしてみた
◎ ソース :
ソースと利用画像は以下。前述の参考ページで紹介されてるサンプルとほとんど同じだけど…。
_01_loadpng_draw.c
_texture.png
Makefile の内容は以下。
_Makefile
実行結果は以下。
ポリゴン(GL_QUADS)にテクスチャ画像を貼り付けることができている。
たしかに、libpng を使って、png画像を読み込んで OpenGL用のテクスチャに変換することができると分かった。
_01_loadpng_draw.c
_texture.png
Makefile の内容は以下。
_Makefile
01_loadpng_draw.exe: 01_loadpng_draw.c Makefile gcc 01_loadpng_draw.c -o 01_loadpng_draw.exe -D FREEGLUT_STATIC -lfreeglut_static -lopengl32 -lwinmm -lgdi32 -lpng -lz .PHONY: clean clean: rm -f *.exe rm -f *.o
- 01_loadpng_draw.c から 01_loadpng_draw.exe を作る。
- -D FREEGLUT_STATIC -lfreeglut_static と指定して、freeglut を静的リンクする。
- -lopengl32 -lwinmm -lgdi32 を指定して、opengl32、winmm、gdi32 をリンク。
- -lpng -lz を指定して、libpng を利用。
実行結果は以下。
ポリゴン(GL_QUADS)にテクスチャ画像を貼り付けることができている。
たしかに、libpng を使って、png画像を読み込んで OpenGL用のテクスチャに変換することができると分かった。
◎ 課題 :
ストレージ上に存在するpng画像ファイルを読み込んで、OpenGL でテクスチャ画像として利用することはできる、と分かったけれど。exeファイルにpng画像をバイナリとして含めておいて、それを OpenGL のテクスチャとして利用する、その方法が分からない…。
リソースファイルなるものにpng画像を含めるように記述しておいて、exeファイル中のリソース(png画像)のポインタ(メモリアドレス?)とバイナリサイズを得ることはできそうなのだけど…。libpng は、メモリ上に置いてあるpng画像のバイナリを読み込むことができるのだろうか…?
リソースファイルなるものにpng画像を含めるように記述しておいて、exeファイル中のリソース(png画像)のポインタ(メモリアドレス?)とバイナリサイズを得ることはできそうなのだけど…。libpng は、メモリ上に置いてあるpng画像のバイナリを読み込むことができるのだろうか…?
[ ツッコむ ]
以上、1 日分です。