2024/01/24(水) [n年前の日記]
#1 [basic] FreeBASICをLinux上で使ってみた
FreeBASIC 1.10.1 を、Ubuntu Linux 20.04 LTS (x64) 上でも使ってみた。
_FreeBASIC Language | Home
FreeBASIC は、無料で利用できるBASICコンパイラ。WindowsやLinuxで使うことができる。BASICでソースを書いてコンパイルすると単一の実行形式ファイルになる。GUIアプリも作れる。構造体やクラスも使える。
_FreeBASIC Language | Home
FreeBASIC は、無料で利用できるBASICコンパイラ。WindowsやLinuxで使うことができる。BASICでソースを書いてコンパイルすると単一の実行形式ファイルになる。GUIアプリも作れる。構造体やクラスも使える。
◎ FreeBASICの古い版をアンインストール :
自分の環境では、FreeBASIC 1.07.3 が既にインストールされていたので、一旦アンインストールした。
FreeBASIC-1.07.3-ubuntu-20.04-x86_64.tar.gz を展開したディレクトリの中に入って以下を打つ。-u をつけることでアンインストールできるらしい。
これで、以下のディレクトリに入っていた FreeBASIC がアンインストールされる。
FreeBASIC-1.07.3-ubuntu-20.04-x86_64.tar.gz を展開したディレクトリの中に入って以下を打つ。-u をつけることでアンインストールできるらしい。
sudo ./install.sh -u
これで、以下のディレクトリに入っていた FreeBASIC がアンインストールされる。
/usr/local/bin/fbc /usr/local/include/freebasic/ /usr/local/lib/freebasic/
◎ 現行版をインストール :
まずは FreeBASIC の動作に必要なパッケージを apt でインストールしておく。
続いて、FreeBASIC 1.10.1 を入手。
_FreeBASIC Compiler - Browse /FreeBASIC-1.10.1/Binaries-Linux at SourceForge.net
_FreeBASIC Compiler - Browse /FreeBASIC-1.10.1 at SourceForge.net
今回は FreeBASIC-1.10.1-linux-x86_64.tar.gz を入手した。何故か Ubuntu Linux 20.04 用が無いので…。22.04 や 18.04用はあるんだけどなあ…。
展開して、ディレクトリに入って以下を打つ。
これで、以下のディレクトリに FreeBASIC 1.10.1 がインストールされた。
fbc のバージョンを確認。
sudo apt install gcc libc6-dev ncurses-dev libx11-dev libxext-dev libxpm-dev libxrandr-dev libxrender-dev
続いて、FreeBASIC 1.10.1 を入手。
_FreeBASIC Compiler - Browse /FreeBASIC-1.10.1/Binaries-Linux at SourceForge.net
_FreeBASIC Compiler - Browse /FreeBASIC-1.10.1 at SourceForge.net
今回は FreeBASIC-1.10.1-linux-x86_64.tar.gz を入手した。何故か Ubuntu Linux 20.04 用が無いので…。22.04 や 18.04用はあるんだけどなあ…。
展開して、ディレクトリに入って以下を打つ。
sudo ./install.sh -i
これで、以下のディレクトリに FreeBASIC 1.10.1 がインストールされた。
/usr/local/bin/fbc /usr/local/include/freebasic/ /usr/local/lib/freebasic/
fbc のバージョンを確認。
$ fbc -version FreeBASIC Compiler - Version 1.10.1 (2023-12-24), built for linux-x86_64 (64bit) Copyright (C) 2004-2023 The FreeBASIC development team.
◎ FBImageライブラリを使用 :
FreeBASICで、png,jpg,tga 画像を読み込めるようにするライブラリ、FBImage が使えるのか試してみた。
_FBImage static Win/Lin 32/64-bit - freebasic.net
FBImage.zip を解凍すると、lib/lin/ の中に、Linux用のライブラリファイル(.a)も入っている。
例えば、Ubuntu Linux 20.04 LTS上で FreeBASICをインストールした場合、以下の場所にヘッダーファイル(.bi)やライブラリファイル(.a)が入るので…。
FBImage の、.bi や .a を、上記のフォルダにコピーしてやればいい。
ただ、.bas ファイルと同じ場所に、.bi や .a を置いておくだけでも、コンパイルは通るようだなと…。システムフォルダ(?)にコピーせずに、プロジェクトフォルダ(.basと同じ場所)に置きっぱなしにして使ったほうがいいのかもしれない。
さておき。
_FBImage static Win/Lin 32/64-bit - freebasic.net
FBImage.zip を解凍すると、lib/lin/ の中に、Linux用のライブラリファイル(.a)も入っている。
例えば、Ubuntu Linux 20.04 LTS上で FreeBASICをインストールした場合、以下の場所にヘッダーファイル(.bi)やライブラリファイル(.a)が入るので…。
/usr/local/include/freebasic/ /usr/local/lib/freebasic/linux-x86_64/
FBImage の、.bi や .a を、上記のフォルダにコピーしてやればいい。
sudo cp *.bi /usr/local/include/freebasic/ sudo cp *.a /usr/local/lib/freebasic/linux-x86_64/
ただ、.bas ファイルと同じ場所に、.bi や .a を置いておくだけでも、コンパイルは通るようだなと…。システムフォルダ(?)にコピーせずに、プロジェクトフォルダ(.basと同じ場所)に置きっぱなしにして使ったほうがいいのかもしれない。
さておき。
- FreeBASIC 1.07.3 で FBImage を使おうとしたら .bas のビルド時にエラーが出てしまった。
- FreeBASIC 1.10.1 で FBImage を使ったら .bas もコンパイルできたし、実行ファイルも動いてくれた。
◎ ソースを1つにしたい :
Windows と Linux の両方で使えるソースにしたい。ソースの中で、「ここからここまでは Windows用」「ここからここまでは Linux用」と振り分けることはできないのだろうか。
以下の定義が使えるらしい。
_FB_WIN32
_FB_LINUX
Windowsだけが使う処理を書くときは、以下のように書く。
Linuxだけが使う処理を書くときは、以下のように書く。
以下の定義が使えるらしい。
__FB_WIN32__ __FB_LINUX__
_FB_WIN32
_FB_LINUX
Windowsだけが使う処理を書くときは、以下のように書く。
#ifdef __FB_WIN32__ ' mmsystemを利用 #include "windows.bi" #include "win/mmsystem.bi" ' タイマー精度を1msecに向上 timeBeginPeriod(1) #endif
Linuxだけが使う処理を書くときは、以下のように書く。
#ifdef __FB_LINUX__ ' Linux only #endif
[ ツッコむ ]
#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 が無いというか、見当たらないっぽい。
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\ の中に、ファイルはあるようだけど…。
一般的に、*.dll.a は、DLLファイルがあることを前提にしたライブラリファイルだったはず。動的リンク用。
できれば静的リンクをしたいので、*.dll.a ではないファイルを、FreeBASICインストールフォルダ\lib\win32\ にコピーしてみた。
しかし、fbc png.bas と打つと、大量にエラーが出る。
であればと、*.dll.a をコピーしてみた。これならビルドが成功して png.exe が生成された。.dll も必要になるはずなので、MSYS2インストールフォルダ\mingw32\bin\ の中から、libpng16-16.dll もコピーしてきた。しかし、実行してみると「エントリーポイントが無い」云々のエラーが出る。
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 を解凍して、ディレクトリの中に入って、以下を打ってビルド。
以下のファイルが生成された。
こうして出来上がったファイルの中から、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
仕方ないので、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
[ ツッコむ ]
以上、1 日分です。