2024/04/04(木) [n年前の日記]
#1 [prog] 自作スクリーンセーバをLinuxに対応させたい
C++とOpenGLを使ってWindows用のスクリーンセーバを自作したけれど。せっかく作ったのだから Linux上でもビルドできるようにしたい。もっとも、Linux用のスクリーンセーバを作るわけではなくて、せめてGLFWを使ったデモプログラムとして動かせるようにするつもり。
Ubuntu Linux 20.04 LTS上でビルドしようとしているけれど、いくつか問題に遭遇。
Linux には tchar.h は無いのだな…。とりあえず今回は、#include <tchar.h> をコメントアウトするだけでビルドできそう。
MessageBox() も無いな…。コレもとりあえずコメントアウトしておく方向で。
実行バイナリに埋め込むバイナリファイル(*.png, *.jpg)のシンボルも、ちょっと変わる。MinGW g++ 6.3.0 用は先頭に「_」がつかないけれど、MSYS2 g++ 13.2.0 や Ubuntu Linux 22.04 LTS の g++ 11.4.0 なら先頭に「_」がつく。
Ubuntu Linux 20.04 LTS上でビルドしようとしているけれど、いくつか問題に遭遇。
Linux には tchar.h は無いのだな…。とりあえず今回は、#include <tchar.h> をコメントアウトするだけでビルドできそう。
MessageBox() も無いな…。コレもとりあえずコメントアウトしておく方向で。
実行バイナリに埋め込むバイナリファイル(*.png, *.jpg)のシンボルも、ちょっと変わる。MinGW g++ 6.3.0 用は先頭に「_」がつかないけれど、MSYS2 g++ 13.2.0 や Ubuntu Linux 22.04 LTS の g++ 11.4.0 なら先頭に「_」がつく。
◎ ソースの切り替えについて :
Windows用とLinux用の両方でビルドが通るように、定義済みマクロでソースの中身が変わるようにした。
- Windows上でビルドする際は _WIN32 が定義される。
- MSYS2上でビルドする際は __MINGW64__ が定義される。
- Linux上でビルドする際は __linux__ が定義される。
#if defined(__MINGW64__) || defined(__linux__) // MSYS2 (Windows, g++ 13.2.0) or Linux #else // MinGW (Windows, g++ 6.3.0) #endif #ifdef _WIN32 // Windows only #include <tchar.h> #include <windows.h> #include <scrnsave.h> #include <mmsystem.h> #endif
◎ Ubuntuのバージョンによって結果が違ってしまう :
VMware Player + Ubuntu Linux 20.04 LTS x64 ならビルドが通るのだけど。実機 + Ubuntu Linux 22.04 LTS x64 ではビルドが通らない…。
Ubuntu Linux 20.04 LTS x64 の場合。ビルドは通る。
Ubuntu Linux 22.04 LTS x64 の場合。エラーが出てしまう…。
このエラーはどういう意味なんだろう…。
Ubuntu Linux 20.04 LTS x64 の場合。ビルドは通る。
$ g++ --version g++ (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0 ... $ ld --version GNU ld (GNU Binutils for Ubuntu) 2.34 ... $ make -f Makefile.glfw g++ -o ssp3droadglfw.o -c ssp3droadglfw.cpp g++ -o render.o -c render.cpp ld -r -b binary -o sprites.o sprites.png ld -r -b binary -o bg_summer.o bg_summer.jpg ld -r -b binary -o bg_autumn.o bg_autumn.jpg ld -r -b binary -o bg_winter.o bg_winter.jpg ld -r -b binary -o bg_night.o bg_night.jpg g++ -o ssp3droadglfw ssp3droadglfw.o render.o sprites.o bg_summer.o bg_autumn.o bg_winter.o bg_night.o -lGL -lGLU -lglfw -lm
Ubuntu Linux 22.04 LTS x64 の場合。エラーが出てしまう…。
$ g++ --version g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 ... $ ld --version GNU ld (GNU Binutils for Ubuntu) 2.38 ... $ make -f Makefile.glfw g++ -o ssp3droadglfw.o -c ssp3droadglfw.cpp g++ -o render.o -c render.cpp ld -r -b binary -o sprites.o sprites.png ld -r -b binary -o bg_summer.o bg_summer.jpg ld -r -b binary -o bg_autumn.o bg_autumn.jpg ld -r -b binary -o bg_winter.o bg_winter.jpg ld -r -b binary -o bg_night.o bg_night.jpg g++ -o ssp3droadglfw ssp3droadglfw.o render.o sprites.o bg_summer.o bg_autumn.o bg_winter.o bg_night.o -lGL -lGLU -lglfw -lm /usr/bin/ld: render.o: relocation R_X86_64_PC32 against absolute symbol `_binary_sprites_png_size' in section `.text' is disallowed collect2: error: ld returned 1 exit status make: *** [Makefile.glfw:26: ssp3droadglfw] エラー 1
このエラーはどういう意味なんだろう…。
◎ テクスチャを展開できない :
ビルドが通る、VMware Player + Ubuntu Linux 20.04 LTS x64上でも、動作に問題がある。出来上がった実行バイナリを動かしてみると、テクスチャ画像を展開できる時と、展開できない時がある…。必ず展開できるわけでもなく、必ず展開できないわけでもない。こういうバグが一番困る…。
実機上なら動作が変わるのだろうか。しかし、そちらは Ubuntu Linux 22.04 LTS だから、ビルド自体が通らない…。
実機上なら動作が変わるのだろうか。しかし、そちらは Ubuntu Linux 22.04 LTS だから、ビルド自体が通らない…。
[ ツッコむ ]
#2 [prog] MSYS2パッケージをダウングレードしておいた
ここ最近、xzパッケージにバックドアが仕掛けられていたという事件が気になってる。MSYS2 のxzパッケージを調べてみたら、事件を起こしたバージョン、5.6.1 が入ってた…。
念のために、一つ前の 5.4.6-2 にダウングレードしてみたい。MSYS2上でそんなことをして意味があるのかないのか分からんけど…。まあ、pacman でダウングレードする方法を知っておいてもいいだろう…。
_パッケージのダウングレード - ArchWiki
_MSYS2でパッケージをダウングレードする - Qiita
/var/cache/pacman/pkg/ に、pacmanのキャッシュが残ってるらしい。調べてみたら、古いバージョンも残っていた。
pacman -U でダウングレードできる。
インストール済み、が 5.4.6-2 になった。
ダウングレードできたら、/etc/pacman.conf の IgnorePkg= にパッケージ名を追加する必要があるらしい。これをしておかないとアップグレードされてしまうのだとか。
これで合ってるのかな…。分からん…。
pacman -Ss xz
念のために、一つ前の 5.4.6-2 にダウングレードしてみたい。MSYS2上でそんなことをして意味があるのかないのか分からんけど…。まあ、pacman でダウングレードする方法を知っておいてもいいだろう…。
_パッケージのダウングレード - ArchWiki
_MSYS2でパッケージをダウングレードする - Qiita
/var/cache/pacman/pkg/ に、pacmanのキャッシュが残ってるらしい。調べてみたら、古いバージョンも残っていた。
$ ls /var/cache/pacman/pkg/ | grep xz mingw-w64-i686-xz-5.4.5-1-any.pkg.tar.zst mingw-w64-i686-xz-5.4.5-1-any.pkg.tar.zst.sig mingw-w64-i686-xz-5.4.6-1-any.pkg.tar.zst mingw-w64-i686-xz-5.4.6-1-any.pkg.tar.zst.sig mingw-w64-i686-xz-5.4.6-2-any.pkg.tar.zst mingw-w64-i686-xz-5.4.6-2-any.pkg.tar.zst.sig mingw-w64-i686-xz-5.6.1-2-any.pkg.tar.zst mingw-w64-i686-xz-5.6.1-2-any.pkg.tar.zst.sig mingw-w64-x86_64-xz-5.4.5-1-any.pkg.tar.zst mingw-w64-x86_64-xz-5.4.5-1-any.pkg.tar.zst.sig mingw-w64-x86_64-xz-5.4.6-1-any.pkg.tar.zst mingw-w64-x86_64-xz-5.4.6-1-any.pkg.tar.zst.sig mingw-w64-x86_64-xz-5.4.6-2-any.pkg.tar.zst mingw-w64-x86_64-xz-5.4.6-2-any.pkg.tar.zst.sig mingw-w64-x86_64-xz-5.6.1-2-any.pkg.tar.zst mingw-w64-x86_64-xz-5.6.1-2-any.pkg.tar.zst.sig xz-5.4.5-1-x86_64.pkg.tar.zst xz-5.4.5-1-x86_64.pkg.tar.zst.sig xz-5.4.6-1-x86_64.pkg.tar.zst xz-5.4.6-1-x86_64.pkg.tar.zst.sig xz-5.4.6-2-x86_64.pkg.tar.zst xz-5.4.6-2-x86_64.pkg.tar.zst.sig xz-5.6.1-2-x86_64.pkg.tar.zst xz-5.6.1-2-x86_64.pkg.tar.zst.sig $ ls /var/cache/pacman/pkg/ | grep lzma liblzma-5.4.5-1-x86_64.pkg.tar.zst liblzma-5.4.5-1-x86_64.pkg.tar.zst.sig liblzma-5.4.6-1-x86_64.pkg.tar.zst liblzma-5.4.6-1-x86_64.pkg.tar.zst.sig liblzma-5.4.6-2-x86_64.pkg.tar.zst liblzma-5.4.6-2-x86_64.pkg.tar.zst.sig liblzma-5.6.1-2-x86_64.pkg.tar.zst liblzma-5.6.1-2-x86_64.pkg.tar.zst.sig
pacman -U でダウングレードできる。
pacman -U file:///var/cache/pacman/pkg/mingw-w64-i686-xz-5.4.6-2-any.pkg.tar.zst pacman -U file:///var/cache/pacman/pkg/mingw-w64-x86_64-xz-5.4.6-2-any.pkg.tar.zst pacman -U file:///var/cache/pacman/pkg/xz-5.4.6-2-x86_64.pkg.tar.zst pacman -U file:///var/cache/pacman/pkg/liblzma-5.4.6-2-x86_64.pkg.tar.zst
$ pacman -Ss xz clangarm64/mingw-w64-clang-aarch64-xz 5.6.1-2 Library and command line tools for XZ and LZMA compressed files (mingw-w64) mingw32/mingw-w64-i686-xz 5.6.1-2 [インストール済み: 5.4.6-2] Library and command line tools for XZ and LZMA compressed files (mingw-w64) mingw64/mingw-w64-x86_64-xz 5.6.1-2 [インストール済み: 5.4.6-2] Library and command line tools for XZ and LZMA compressed files (mingw-w64) ucrt64/mingw-w64-ucrt-x86_64-xz 5.6.1-2 Library and command line tools for XZ and LZMA compressed files (mingw-w64) clang32/mingw-w64-clang-i686-xz 5.6.1-2 Library and command line tools for XZ and LZMA compressed files (mingw-w64) clang64/mingw-w64-clang-x86_64-xz 5.6.1-2 Library and command line tools for XZ and LZMA compressed files (mingw-w64) msys/liblzma 5.6.1-2 (libraries) [インストール済み: 5.4.6-2] Library for XZ and LZMA compressed files msys/xz 5.6.1-2 (compression) [インストール済み: 5.4.6-2] Library and command line tools for XZ and LZMA compressed files
インストール済み、が 5.4.6-2 になった。
ダウングレードできたら、/etc/pacman.conf の IgnorePkg= にパッケージ名を追加する必要があるらしい。これをしておかないとアップグレードされてしまうのだとか。
vi /etc/pacman.conf
IgnorePkg = xz liblzma mingw-w64-i686-xz mingw-w64-x86_64-xz
これで合ってるのかな…。分からん…。
[ ツッコむ ]
#3 [anime] 「勇気爆発バーンブレイバーン」最終回を視聴
録画してたソレをようやく視聴。ロボットアニメ…だろうか? だよな。たぶん。
いやはやコレは…。なんというか…。途中まで「自分は一体何を見せられているんだろう…?」と…。素晴らしい。
なんとなく、「真面目に不真面目」とか「ふざける時は全力で」とかそういう言葉が脳裏に浮かんだ。どうせやるなら徹底的に、だよな…。何にせよ、とんでもないアニメを見せてもらった気がする…。
いやはやコレは…。なんというか…。途中まで「自分は一体何を見せられているんだろう…?」と…。素晴らしい。
なんとなく、「真面目に不真面目」とか「ふざける時は全力で」とかそういう言葉が脳裏に浮かんだ。どうせやるなら徹底的に、だよな…。何にせよ、とんでもないアニメを見せてもらった気がする…。
[ ツッコむ ]
以上、1 日分です。