mieki256's diary



2024/01/24(水) [n年前の日記]

#2 [basic] FreeBASICでlibpngを使おうとした

Windows10 x64 22H2 + FreeBASIC 1.10.1 で、libpng が使えるのかどうか気になった。libpng というのは、png画像の読み書きをするためのライブラリ。

FreeBASICインストールフォルダ内の、examples\files\libpng\ の中に、png.bas と言うファイルがある。これが libpng を利用するサンプルソース。png.bi を include することで libpng 関連の機能が利用できるらしい。

しかし、fbc png.bas と打って exe を作ろうとしたところ、-lpng でエラーが出た。ライブラリファイル libpng.a が無いというか、見当たらないっぽい。

MSYS2のファイルを流用しようとしたけど失敗 :

MSYS2 の中に入っている libpng.a を探してコピーしようとしたけれど、なんだか色んなファイルがあって…。MSYS2インストールフォルダ\mingw32\lib\ の中に、ファイルはあるようだけど…。
libpng.a
libpng.dll.a
libpng16.a
libpng16.dll.a

一般的に、*.dll.a は、DLLファイルがあることを前提にしたライブラリファイルだったはず。動的リンク用。

できれば静的リンクをしたいので、*.dll.a ではないファイルを、FreeBASICインストールフォルダ\lib\win32\ にコピーしてみた。

しかし、fbc png.bas と打つと、大量にエラーが出る。

であればと、*.dll.a をコピーしてみた。これならビルドが成功して png.exe が生成された。.dll も必要になるはずなので、MSYS2インストールフォルダ\mingw32\bin\ の中から、libpng16-16.dll もコピーしてきた。しかし、実行してみると「エントリーポイントが無い」云々のエラーが出る。

libzとlibpngをビルドしてみた :

色々試してみたけどエラーが出る。何をどうしたらいいのかさっぱり分からない。

仕方ないので、MinGW (gcc 6.3.0) を使って、zlib と libpng をビルドしてみた。ビルドに使ったソースは以下。
  • zlib-1.3.1.tar.gz
  • libpng-1.6.40.tar.xz

zlib-1.3.1.tar.gz を解凍して、ディレクトリの中に入って、以下を打ってビルド。
make -f win32/Makefile.gcc all

以下のファイルが生成された。
libz.a
libz.dll.a
zconf.h
zlib.h
zlib1.dll

libpng-1.6.40.tar.xz を解凍して、ディレクトリの中に入って、以下を打ってビルド。
make -f scripts/makefile.gcc

以下のファイルが生成された。
libpng.a
png.h
pngconf.h
pngdebug.h
pnginfo.h
pnglibconf.h
pngpriv.h
pngstruct.h

こうして出来上がったファイルの中から、libz.a と libpng.a の2ファイルだけを、FreeBASICインストールフォルダ\lib\win32\ にコピーしてみた。また、libz.a だけを使ってほしいので、libz.dll.a は libz.dll.a.esc に、libzlib.a は libzlib.a.esc にリネームして使われないようにしてみた。

この状態なら、fbc png.bas でビルドが通って、png.exe が生成された。また、png.exe を実行してもエラーにならない。ちゃんと png画像が表示された。

同じ手順で、MSYS2 MINGW64 (gcc 13.2.0) を使って、64bit版の libz.a と libpng.a をビルドしてみた。コレを、FreeBASICインストールフォルダ\lib\win64\ 以下にコピー。fbc64 png.bas と打ってみたら、32bit版と同様、png.exe が生成された。かつ、実行してもエラーにならなかった。

そんなわけで、zlib と libpng を、MinGW(gcc 6.3.0)、もしくは MSYS2 MINGW64 (gcc 13.2.0) を用いて自分でビルドして *.a を作って、その *.a を FreeBASIC で利用すれば、libpng を使ったサンプルソースもビルドできるし動いてくれる、と分かった。

せっかくビルドしたので一応置いときます。*_mingw が32bit版で、*_mingw64 が64bit版。他の環境で使えるのかどうかは分からんけど…。

_zlib-1.3.1_build_mingw.zip
_libpng-1.6.40_build_mingw.zip

_zlib-1.3.1_build_mingw64.zip
_libpng-1.6.40_build_mingw64.zip

以上です。

過去ログ表示

Prev - 2024/01 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project