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 だから、ビルド自体が通らない…。
[ ツッコむ ]
以上です。