mieki256's diary



2024/01/25(木) [n年前の日記]

#1 [prog] OSDN版のMinGWについて調べてた

OSDN(osdn.net)の閉鎖が決まったという話を見かけた。

_老舗掲示板サイト「スラド」が2024年1月末に終了、「OSDN」も接続困難なまま閉鎖か - 窓の杜

困った。ここ最近利用している MinGW (C/C++コンパイラ + 開発ツール一式) の最新版は OSDN で配布されているわけで…。今後は MinGW が手に入らなくなってしまう…。アプリのビルド等の実験ができなくなる…。

いやまあ、まだ SourceForge から入手できなくはないのだけど、ただ、色々なパッケージのバージョンが古いのだよな…。

_MinGW - Minimalist GNU for Windows download | SourceForge.net

実際のところ OSDN版 MinGW は、SourceForge版 MinGW と比べて、どのくらいパッケージが差し変わっているのか気になってきた。そんなわけで、少し調べてみた。

全パッケージをインストールしてみた :

とりあえず、SourceForge版、OSDN版、両方の MinGW で、ほぼ全パッケージをダウンロードしてインストールしてみた。インストール時に、なんだか大量にコンフリクト(衝突)が起きていたのが気になるけど…。でもまあ、パッケージファイルのダウンロードぐらいはできてるだろう…。

ダウンロードされたパッケージは、以下の場所にキャッシュとして残っている。
MinGWインストールフォルダ\var\cache\mingw-get\packages\

SourceForge版と、OSDN版の、それぞれのキャッシュの状態を比較すれば、どのパッケージが差し変わった/新しくなったのかが分かるのではないかなあ、と…。

差し変わったのかもしれないファイルの一覧 :

ということで、OSDN版のキャッシュにはあるけど、SourceForge版のキャッシュには無いパッケージファイルは、以下のような状態だった。

binutils-2.32-1-mingw32-bin.tar.xz
binutils-2.32-1-mingw32-dev.tar.xz
binutils-2.32-1-mingw32-info.tar.xz
binutils-2.32-1-mingw32-lang.tar.xz
binutils-2.32-1-mingw32-man.tar.xz
dos2unix-7.3.2-1-mingw32-bin.tar.lzma
dos2unix-7.3.2-1-mingw32-doc.tar.lzma
dos2unix-7.3.2-1-mingw32-lic.tar.lzma
expat-2.2.9-1-mingw32-bin.tar.xz
expat-2.2.9-1-mingw32-html.tar.xz
expat-2.2.9-1-mingw32-lic.tar.xz
expat-2.2.9-1-mingw32-man.tar.xz
gcc-9.2.0-2-mingw32-info.tar.xz
gcc-9.2.0-2-mingw32-lang.tar.xz
gcc-9.2.0-2-mingw32-lic.tar.xz
gcc-9.2.0-2-mingw32-man.tar.xz
gcc-ada-9.2.0-2-mingw32-bin.tar.xz
gcc-c++-9.2.0-2-mingw32-bin.tar.xz
gcc-c++-9.2.0-2-mingw32-man.tar.xz
gcc-core-9.2.0-2-mingw32-bin.tar.xz
gcc-fortran-9.2.0-2-mingw32-bin.tar.xz
gcc-fortran-9.2.0-2-mingw32-info.tar.xz
gcc-fortran-9.2.0-2-mingw32-man.tar.xz
gcc-objc-9.2.0-2-mingw32-bin.tar.xz
gmp-6.1.2-3-mingw32-dev.tar.xz
gmp-6.1.2-3-mingw32-info.tar.xz
gmp-6.1.2-3-mingw32-lic.tar.xz
isl-0.21-2-mingw32-dev.tar.xz
isl-0.21-2-mingw32-doc.tar.xz
isl-0.21-2-mingw32-lic.tar.xz
libatomic-9.2.0-2-mingw32-dll-1.tar.xz
libcharset-1.14-4-mingw32-dll-1.tar.xz
libexpat-2.2.9-1-mingw32-dev.tar.xz
libexpat-2.2.9-1-mingw32-dll-1.tar.xz
libgcc-9.2.0-2-mingw32-dll-1.tar.xz
libgfortran-9.2.0-2-mingw32-dll-5.tar.xz
libgmp-6.1.2-3-mingw32-dll-10.tar.xz
libgmpxx-6.1.2-3-mingw32-dll-4.tar.xz
libgnat-9.2.0-2-mingw32-dll-9.tar.xz
libgomp-9.2.0-2-mingw32-dll-1.tar.xz
libiconv-1.14-4-mingw32-bin.tar.xz
libiconv-1.14-4-mingw32-dev.tar.xz
libiconv-1.14-4-mingw32-dll-2.tar.xz
libiconv-1.14-4-mingw32-html.tar.xz
libiconv-1.14-4-mingw32-lang.tar.xz
libiconv-1.14-4-mingw32-lic.tar.xz
libiconv-1.14-4-mingw32-man.tar.xz
libisl-0.21-2-mingw32-dll-21.tar.xz
liblzma-4.999.9beta_20100401-1-msys-1.0.13-dll-1.tar.gz
liblzma-5.2.5-2-mingw32-dev.tar.xz
liblzma-5.2.5-2-mingw32-dll-5.tar.xz
libmingwex-5.4.2-mingw32-dev.tar.xz
libmingwex-5.4.2-mingw32-dll-4.tar.xz
libmpc-1.1.0-1-mingw32-dll-3.tar.xz
libmpfr-4.0.2-1-mingw32-dll-6.tar.xz
libncurses-6.2-2-mingw32-dev.tar.xz
libncurses-6.2-2-mingw32-dll-6.tar.xz
libobjc-9.2.0-2-mingw32-dll-4.tar.xz
libpthread-2.8.0-3-mingw32-dll-2.tar.lzma
libquadmath-9.2.0-2-mingw32-dll-0.tar.xz
libquadmath-9.2.0-2-mingw32-info.tar.xz
libssp-9.2.0-2-mingw32-dll-0.tar.xz
libstdc++-9.2.0-2-mingw32-dll-6.tar.xz
libz-1.2.11-1-mingw32-dev.tar.xz
libz-1.2.11-1-mingw32-dll-1.tar.xz
mingw-get-0.6.3-mingw32-pre-20170905-1-bin.tar.xz
mingw-get-0.6.3-mingw32-pre-20170905-1-gui.tar.xz
mingw-get-0.6.3-mingw32-pre-20170905-1-lic.tar.xz
mingw-get-setup-0.6.3-mingw32-pre-20170905-1-dll.tar.xz
mingw-get-setup-0.6.3-mingw32-pre-20170905-1-xml.tar.xz
mingwrt-5.4.2-mingw32-dev.tar.xz
mingwrt-5.4.2-mingw32-dll.tar.xz
mingwrt-5.4.2-mingw32-lic.tar.xz
mingwrt-5.4.2-mingw32-man.tar.xz
mpc-1.1.0-1-mingw32-dev.tar.xz
mpc-1.1.0-1-mingw32-info.tar.xz
mpc-1.1.0-1-mingw32-lic.tar.xz
mpfr-4.0.2-1-mingw32-dev.tar.xz
mpfr-4.0.2-1-mingw32-doc.tar.xz
mpfr-4.0.2-1-mingw32-info.tar.xz
mpfr-4.0.2-1-mingw32-lic.tar.xz
ncurses-6.2-2-mingw32-bin.tar.xz
ncurses-6.2-2-mingw32-doc.tar.xz
ncurses-6.2-2-mingw32-lic.tar.xz
ncurses-6.2-2-mingw32-man.tar.xz
pexports-0.48-mingw32-bin.tar.xz
pexports-0.48-mingw32-doc.tar.xz
pexports-0.48-mingw32-lic.tar.xz
terminfo-6.2-2-mingw32-data.tar.xz
w32api-5.4.2-mingw32-dev.tar.xz
wsl-features-20190122-1-mingw32-cfg.tar.xz
xz-5.2.5-2-mingw32-bin.tar.xz
xz-5.2.5-2-mingw32-doc.tar.xz
xz-5.2.5-2-mingw32-ext.tar.xz
xz-5.2.5-2-mingw32-lang.tar.xz
xz-5.2.5-2-mingw32-lic.tar.xz
xz-5.2.5-2-mingw32-man.tar.xz
zlib-1.2.11-1-mingw32-doc.tar.xz
zlib-1.2.11-1-mingw32-lic.tar.xz
zlib-1.2.11-1-mingw32-man.tar.xz

  • 各パッケージの中には、bin/, include/, lib/ などが入っている。MinGWインストールフォルダの bin/, include/, lib/ にそのまま入れるのだろう。
  • *bin* や *dll* が、実行に必要なファイルが入ってるパッケージ。
  • *dev* が、そのライブラリを使ってコンパイル作業をする際に必要になるパッケージ。
  • *doc* や *man* は、おそらくドキュメント。無くてもなんとかなりそう。
  • *lic* は、ライセンス文書。これも無くてもなんとかなりそう。
  • *lang* は、多言語対応用のリソースだろうか。英語のメッセージで十分なら無くてもどうにか。

つまり、上記のパッケージファイルをどうにか入手して、解凍して、SourceForge版のファイル群と差し替えてやれば、OSDN版 MinGW 相当になるのではないのかなと…。考えが甘いだろうか…?

ミラーサーバについて :

OSDN版のパッケージは他のサーバでミラーリングしてないのだろうか。ググってみたら、以下のメモに遭遇。ありがたや。

_OSDNのミラーコンテンツ 2023/11/19

日本国内のサーバに限れば、IIJ と JAIST に残ってる可能性があるらしい。ありがたや。これは助かりそう。

_https://ftp.iij.ad.jp/pub/osdn.jp/storage/g/m/mi/mingw/
_https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/m/mi/mingw/

この中から、前述のファイル群を探し出して入手していけば、どうにかなるのかな…。いや、分からんけど…。

でも、探し出すの、どう考えても面倒臭いよな…。どうせ全部で100MBも無いから、 _上記のファイル群をzipにして、 試しに OneDrive に置いてみます。問題があったら削除しますので…。まあ、上記のミラーサーバのディレクトリ内を探していけば全く同じものが入手できるだろうけど。

MinGW以外の選択肢 :

MinGW が入手できなくなりそうで困ったなと書いてみたけど。今現在、Windows上で gcc/g++ (C/C++コンパイラ) を使いたいなら、MSYS2 を導入するのが妥当な気もする。MSYS2 なら、32bit版のみ対応の MinGW と違って、i686版(32bit版)、x86_64版(64bit) も選べるし。MinGW と比べて、より多くのビルド済みパッケージが用意されていて便利な面もあるし。

_MSYS2


あるいは、そもそも、「Windows上で C++ を使いたい!」なら、Microsoft が公式に用意してくれている Visual Studio Community を利用するのが無難な気もする。個人利用や教育/学術目的なら無料で利用させてもらえるし…。

_Visual Studio Tools のダウンロード - Windows、Mac、Linux 用の無料インストール


自分の場合、gcc/g++ を使って Windows用のスクリーンセーバを作ってみたいと思ってしまったので、スクリーンセーバ用ライブラリ libscrnsave.a が用意されている MinGW にこだわっているけれど。 *1

  • 「スクリーンセーバ? そんなもの作らないよ」と言うことなら MSYS2 で問題無し。むしろ MSYS2 のほうが便利かも。
  • 「Microsoft公式の開発ツールを使えば妙なところでハマらなくて済むだろう」「利用者も圧倒的に多いから参考資料も多い」と言うことなら Visual Studio Community を選ばない理由は無いし。
  • バージョンが古くてもいいなら、まだ SourceForge版 MinGW が入手できる。というか自分も今現在 SourceForge版 MinGW で作業してるし…。

そんなわけで、「OSDNが死んだら Windows上で無料で利用できる C/C++コンパイラが無くなってしまう!」という状態ではないわけで。

とは言え、「昔は新しいパッケージを利用することもできたけど、今は利用できない」という状況もなんだかなあ、と…。いや、単に新しいパッケージを使いたいだけなら MSYS2 を使えばいいんだろうけど…。

*1: MSYS2 に入ってる libscrnsave.a は中身が空なので…。

#2 [basic] FreeBASICとSDL2_mixerでoggを再生できるか試した

Windows10 x64 22H2 + FreeBASIC 1.10.1 32bit でサウンドを鳴らしてみたい。できれば ogg (Ogg Vorbis)を再生したい。

Ogg Vorbis (正確には Vorbis) というのは非可逆圧縮の音声ファイル。mp3 みたいなもの。mp3 と違ってライセンスが緩く、ギャップレス再生もできるので、mp3 よりもゲーム制作に利用し易い。

_Vorbis - Wikipedia

方法についてググってみたら以下の解説記事に遭遇。

_Simplest code to play MP3 or OGG with SDL - freebasic.net
_Windows Ini File FreeBASIC

SDL2 と SDL2_mixer を利用すれば鳴らすことができるようだなと…。

ちなみに、FreeBASIC は、標準状態では beep を鳴らすことしかできないらしい。NEC PC-8001レベルだなあ…。

_FaqPgrtlib

SDL2関連ファイルの入手 :

oggを再生するために、SDL2 と SDL2_mixer を FreeBASIC に導入しないといけない。

当初、SDL2-devel-2.29.2-mingw.zip と SDL2_mixer-devel-2.8.0-mingw.zip を入手して、中に入っていた .dll や .a を利用しようとしたのだけど、それでは正常動作してくれなかった。

FreeBASICインストールフォルダ/inc/SDL2/*.bi を眺めたところ、各ファイルの最初のあたりに、利用を想定している SDL2 のバージョンが書いてあることに気づいた。FreeBASIC 1.10.1 の時点では、それぞれ以下のバージョンが推奨されているらしい。

SDL.bi       : SDL2-2.0.14
SDL_image.bi : SDL2_image-2.0.5
SDL_Mixer.bi : SDL2_mixer-2.0.4
SDL_net.bi   : SDL2_net-2.0.1
SDL_ttf.bi   : SDL2_ttf-2.0.15

SDL2_gfx_framerate.bi       : SDL2_gfx-1.0.4
SDL2_gfx_imageFilter.bi     : SDL2_gfx-1.0.4
SDL2_gfx_primitives.bi      : SDL2_gfx-1.0.4
SDL2_gfx_primitives_font.bi : SDL2_gfx-1.0.4
SDL2_gfx_rotozoom.bi        : SDL2_gfx-1.0.4

これらのバージョンを入手しないと…。以下からSDL2関連ファイルを入手する。

_SDL2 - Index of /release
_SDL2_image - Index of /projects/SDL_image/release
_SDL2_mixer - Index of /projects/SDL_mixer/release
_SDL2_net - Index of /projects/SDL_net/release
_SDL2_ttf - Index of /projects/SDL_ttf/release

入手するファイルは以下。ファイル名に mingw と記載されてるファイルを入手する。今回は SDL2 と SDL2_mixer を利用できればいいので他のファイルは要らんのだけど、ついでなので…。
SDL2-devel-2.0.14-mingw.tar.gz
SDL2_image-devel-2.0.5-mingw.tar.gz
SDL2_mixer-devel-2.0.4-mingw.tar.gz
SDL2_net-devel-2.0.1-mingw.tar.gz
SDL2_ttf-devel-2.0.15-mingw.tar.gz

解凍すると、中には i686-w64-mingw32/, x86_64-w64-mingw32/ が入っている。i686が32bit版、x86_64 が64bit版。
  • bin/*.dll が実行に必要なDLLファイル。
  • lib/*.a が、コンパイル時に必要になるライブラリファイル。

*.dll と *.a、どちらもプロジェクトフォルダにコピーしてしまってもいいし、あるいは、*.a を、FreeBASICインストールフォルダ/lib/win??/ にコピーしてしまってもいい。ただ、SDL2 を使っているプログラムを実行する際は、同じフォルダ内に SDL2関係の .dll が必要になる、と思う。たぶん。

今回必要になるDLLファイルは以下になる。
# SDL2

SDL2.dll
sdl2-config

# SDL2_mixer

libFLAC-8.dll
libmodplug-1.dll
libmpg123-0.dll
libogg-0.dll
libopus-0.dll
libopusfile-0.dll
libvorbis-0.dll
libvorbisfile-3.dll
SDL2_mixer.dll


コンパイル時に必要になりそうな .a ファイルは以下。
# SDL2

libSDL2.a
libSDL2.dll.a
libSDL2_test.a
libSDL2main.a

# SDL2_mixer

libSDL2_mixer.a
libSDL2_mixer.dll.a

サンプルソース :

前述の解説記事からコピペして、サンプルソースを作成。

_ogg_play_sdl2.bas
' ogg play with SDL2 and SLD2_mixer
' request : SDL2 2.0.14, SDL2_mixer 2.0.4

#include "SDL2/SDL_mixer.bi"
dim mymusic as Mix_Music ptr

chdir exepath()

Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096)

' Here your music file in *.mp3 or *.ogg
mymusic = Mix_LoadMUS("bgm.ogg")

Mix_VolumeMusic(128)  ' 128 is the maximum volume

' 0 play once / -1  play infinit loop
' Mix_PlayMusic(mymusic, 0)

print "Press 1 to stop music."
print "Press 2 to play music."
print "Press 3 to pause music."
print "Press 4 to resume music."
print "Press space key to exit program."

Dim As Boolean running = True
While running
    Dim As String k = inkey$
    Select Case k
    Case "1": Mix_HaltMusic()
    Case "2": Mix_PlayMusic(mymusic, -1)
    Case "3": Mix_PauseMusic()
    Case "4": Mix_ResumeMusic()
    Case " ": running = False
    End Select
    
    sleep 200
Wend

FINALIZATION:
Mix_CloseAudio()

今回は、bgm.ogg というファイルを読み込ませている。

_bgm.ogg

fbc ogg_play_sdl2.bas でコンパイル。ogg_play_sdl2.exe が生成された。

実行してみると以下のメッセージが表示される。
> ogg_play_sdl2.exe
Press 1 to stop music.
Press 2 to play music.
Press 3 to pause music.
Press 4 to resume music.
Press space key to exit program.

1, 2, 3, 4, Spaceキーで、oggを停止、再生、ポーズ、リジューム(ポーズ解除)、プログラムの終了ができた。

ということで、FreeBASIC + SDL2 + SDL2_mixer を使えば、ogg (Ogg Vorbis) が再生できると分かった。ゲームのBGMとして鳴らせそうではあるなと…。しかし、BGMはこれでなんとかなるとして、SE はどうすれば…? 複数のチャンネルで鳴らせないと話にならないよな…。

余談。SDL1.xについて :

FreeBASIC は、SDL (SDL 1.x) と SDL2 (2.x) を使えるようで、今回は SDL2 を使ったわけだけど。

先日、SDL (SDL 1.x) を利用できるか実験したときは、MSYS2 の mingw32/ 以下から *.a を持ってきて試してみたら動いてしまったわけで…。アレって、SDL 1.x のバージョンは合ってたのだろうか? 不安になってきたので調べてみた。

FreeBASICインストールフォルダ/inc/SDL/*.bi に記述されてる、SDL 1.x の推奨バージョンは以下になっていた。
SDL.bi       : SDL-1.2.15
SDL_image.bi : SDL_image-1.2.12
SDL_mixer.bi : SDL_mixer-1.2.12
SDL_net.bi   : SDL_net-1.2.8
SDL_ttf.bi   : SDL_ttf-2.0.11

SDL_gfx_framerate.bi       : SDL_gfx-2.0.26
SDL_gfx_imageFilter.bi     : SDL_gfx-2.0.26
SDL_gfx_primitives.bi      : SDL_gfx-2.0.26
SDL_gfx_primitives_font.bi : SDL_gfx-2.0.26
SDL_gfx_rotozoom.bi        : SDL_gfx-2.0.26

MSYS2側のパッケージのバージョンは以下になっていた。(x:/msys64/var/cache/pacman/pkg/mingw-w64-i686-SDL*)
mingw-w64-i686-SDL-1.2.15+r419+gef3a6c05-1-any.pkg.tar.zst
mingw-w64-i686-SDL_image-1.2.12-8-any.pkg.tar.zst
mingw-w64-i686-SDL_mixer-1.2.12-9-any.pkg.tar.zst
mingw-w64-i686-SDL_net-1.2.8-3-any.pkg.tar.zst
mingw-w64-i686-SDL_ttf-2.0.11-6-any.pkg.tar.zst
mingw-w64-i686-SDL_gfx-2.0.27-1-any.pkg.tar.zst

SDL_gfx 以外は、たまたまバージョンが一致していた模様。 *1 だからすんなり動いてしまったのかもしれないな…。

*1: SDL 1.x の最終バージョンだろうから、一致するのは当たり前だろうか…。

以上、1 日分です。

過去ログ表示

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