2023/07/29(土) [n年前の日記]
#1 [love2d][ubuntu][linux] Ubuntu 20.04 LTS上でlove2dが動かなかった件について
Ubuntu Linux 18.04 LTS から 20.04 LTS にアップグレードした環境で、love2d 11.3, 11.4 PPA版を動かそうとしても、libsndio.so.6.1 を要求されてしまって動かなかったのだけど、その原因が分かった。独自にビルドしたSDL2関連の共有ライブラリが使われる状態になっていたせいだった。
本来、Ubuntu Linux 20.04 LTS は、SDL2の共有ライブラリとして、/usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0 を使うのだけど、今回アップグレードした環境では、/usr/local/lib/libSDL2-2.0.so.0 が使われていて、その libSDL2-2.0.so.0 が古かったため、libsndio.so.6.1 を要求して、しかしそんなファイルは無いので、エラーを出してしまっていた。
解決策は以下。
この状態でPPA版 love2d 11.4 を実行したら(端末上で love と打つ)、love2d がエラーを出さずに動いてくれた。
本来、Ubuntu Linux 20.04 LTS は、SDL2の共有ライブラリとして、/usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0 を使うのだけど、今回アップグレードした環境では、/usr/local/lib/libSDL2-2.0.so.0 が使われていて、その libSDL2-2.0.so.0 が古かったため、libsndio.so.6.1 を要求して、しかしそんなファイルは無いので、エラーを出してしまっていた。
解決策は以下。
- /usr/local/lib/ 内の libSDL2* を別のディレクトリに移動。sudo mv /usr/local/lib/libSDL2* ~/backup を実行。
- 共有ライブ等のキャッシュを更新。sudo ldconfig を実行。
- 共有ライブラリの一覧を見て、/usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0 が入ってるか確認。ldconfig -p | grep SDL2 を実行。
この状態でPPA版 love2d 11.4 を実行したら(端末上で love と打つ)、love2d がエラーを出さずに動いてくれた。
◎ 余談。PPA版 love2d のインストール方法 :
以下のページで配布されてる。
_love-stable : Bart van Strien
以下を打てばインストールできる。
_love-stable : Bart van Strien
以下を打てばインストールできる。
sudo add-apt-repository ppa:bartbes/love-stable sudo apt update sudo apt upgrade sudo apt install love
◎ 原因を調べていった際の作業の流れをメモ :
love2d 11.4 PPA版が動いてる環境と動いてない環境に対して、まずは /usr/bin/love のバイナリに違いがあるのか調べてみた。
md5sum という、MD5アルゴリズムによるハッシュ値を取得するツールを使って、/usr/bin/love に違いがあるのか確認。
どちらも同じ値になった。つまり、異なるバイナリを動かしているわけではない、と分かった。
次に、ldd というツールを使って、それぞれが要求する共有ライブラリの一覧を取得した。
_edit_love_dep_so_i52500.txt (動かない環境)
_edit_love_dep_so_onvm.txt (動く環境)
Windows10 x64 22H2 + WinMerge 2.16.20.4 を使って違いを眺めたところ…。
ls /usr/local/lib で、/usr/local/lib/ 内のファイル一覧を眺めてみたら…。
_usr_local_lib.txt
love2d が動かない環境では、/usr/local/lib/ 内に、SDL2関連ファイルがごっそり入っていた。これらのファイルが呼ばれてしまうことで、動作が違ってしまっていたようだなと…。
どうしてこんな状態になっていたのか、日記を検索して調べてみたら、2017/10/28頃に go-sdl2 というライブラリの動作確認をするために、SDL2関連のビルドとインストールをしていた。このせいでおかしなことになっていたのだな…。
_mieki256's diary - Ubuntu 16.04にgolangとgo-sdl2をインストール
そんなわけで、libsndio.so.6.1 が無い、といったエラーが出てアプリが動かない場合は、共有ライブラリがおかしなことになってないか確認する、というのはアリなのかもしれない。
以下を打てば共有ライブラリの一覧が見れるし、libSDL2* がどの場所にあるか確認もできる。
md5sum という、MD5アルゴリズムによるハッシュ値を取得するツールを使って、/usr/bin/love に違いがあるのか確認。
$ md5sum /usr/bin/love 3c9d0f4a64e21be46ebf56cd253668fc /usr/bin/love
どちらも同じ値になった。つまり、異なるバイナリを動かしているわけではない、と分かった。
次に、ldd というツールを使って、それぞれが要求する共有ライブラリの一覧を取得した。
ldd /usr/bin/love
_edit_love_dep_so_i52500.txt (動かない環境)
_edit_love_dep_so_onvm.txt (動く環境)
Windows10 x64 22H2 + WinMerge 2.16.20.4 を使って違いを眺めたところ…。
- 依存している *.so の数が全然違う。
- 動かない環境の love だけが libsndio.so.6.1 に依存している。
- 動く環境では、love は libsndio.so.6.1 に依存していない。
- 呼び出される libSDL2-2.0.so.0 の場所が違う。動く環境は、/usr/lib/x86_64-linux-gnu/。動かない環境は、/usr/local/lib/。
ls /usr/local/lib で、/usr/local/lib/ 内のファイル一覧を眺めてみたら…。
_usr_local_lib.txt
love2d が動かない環境では、/usr/local/lib/ 内に、SDL2関連ファイルがごっそり入っていた。これらのファイルが呼ばれてしまうことで、動作が違ってしまっていたようだなと…。
どうしてこんな状態になっていたのか、日記を検索して調べてみたら、2017/10/28頃に go-sdl2 というライブラリの動作確認をするために、SDL2関連のビルドとインストールをしていた。このせいでおかしなことになっていたのだな…。
_mieki256's diary - Ubuntu 16.04にgolangとgo-sdl2をインストール
そんなわけで、libsndio.so.6.1 が無い、といったエラーが出てアプリが動かない場合は、共有ライブラリがおかしなことになってないか確認する、というのはアリなのかもしれない。
以下を打てば共有ライブラリの一覧が見れるし、libSDL2* がどの場所にあるか確認もできる。
ldconfig -p
$ ldconfig -p | grep SDL2 libSDL2_ttf-2.0.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libSDL2_ttf-2.0.so.0 libSDL2_ttf-2.0.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libSDL2_ttf-2.0.so libSDL2_mixer-2.0.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libSDL2_mixer-2.0.so.0 libSDL2_mixer-2.0.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libSDL2_mixer-2.0.so libSDL2_image-2.0.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libSDL2_image-2.0.so.0 libSDL2_image-2.0.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libSDL2_image-2.0.so libSDL2-2.0.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0 libSDL2-2.0.so.0 (libc6) => /usr/lib/i386-linux-gnu/libSDL2-2.0.so.0 libSDL2-2.0.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so
[ ツッコむ ]
以上、1 日分です。