2024/02/27(火) [n年前の日記]
#1 [prog] GLFWを使ったC言語のソースをコンパイルしようとして少しハマった
OpenGLの学習をする際に、ウインドウの生成処理その他を簡単にしてくれる GLFW というライブラリ(ツールキット?)があって、少し勉強しようとしていたのだけど。C言語で使おうとしたところコンパイル時にリンクエラーが出て少しハマってしまった。
環境は Windows10 x64 22H2 + MinGW gcc 6.3.0。
エラー内容は以下と同じ。
_c++ - "undefined reference to __mingw_free" when linking GLFW - Stack Overflow _c - GLFW with GCC Mingw flags for static doesn't work as documented - Stack Overflow
環境は Windows10 x64 22H2 + MinGW gcc 6.3.0。
エラー内容は以下と同じ。
_c++ - "undefined reference to __mingw_free" when linking GLFW - Stack Overflow _c - GLFW with GCC Mingw flags for static doesn't work as documented - Stack Overflow
◎ gcc 6.3.0利用時の注意点 :
一般的には、gcc で glfw3 を使ったソースをコンパイルする場合、-lglfw3 を指定すればリンクができるはずなのだけど…。
SourceForge から入手できる MinGW gcc 6.3.0 を使って、GLFW を利用しているC言語のソースをコンパイルする場合は、以下のように `-lglfw3dll` を指定しないとリンクエラーが出てしまう。
この場合、生成した .exe を動作させるためには、別途 glfw3.dll が必要になる。objdump を使って、生成された exe が要求するdllの一覧を出してみると、glfw3.dll が入ってることが分かる。
SourceForge から入手できる MinGW gcc 6.3.0 を使って、GLFW を利用しているC言語のソースをコンパイルする場合は、以下のように `-lglfw3dll` を指定しないとリンクエラーが出てしまう。
gcc 01_helloglfw.c -o 01_helloglfw.exe -static -lglfw3dll -lopengl32 -lwinmm -lgdi32 -mwindows
この場合、生成した .exe を動作させるためには、別途 glfw3.dll が必要になる。objdump を使って、生成された exe が要求するdllの一覧を出してみると、glfw3.dll が入ってることが分かる。
> objdump -p 01_helloglfw.exe | grep dll DLL Name: glfw3.dll DLL Name: KERNEL32.dll DLL Name: msvcrt.dll DLL Name: msvcrt.dll
◎ gcc 9.2.0なら問題は起きない :
SourceForge から入手できる MinGW gcc 6.3.0 ではなく、OSDN から入手できる MinGW gcc 9.2.0 を使えば、-static -lglfw3 を指定することで、glfw3.dll を必要としない実行形式を作れる。
そもそも、GLFWの公式配布版バイナリに同梱されている README.md には、「MinGW (built with GCC 9.2.0)」という記述があった。gcc 6.3.0 ではなく gcc 9.2.0 の利用を前提としたバイナリだったらしい…。
しかし、MinGW gcc 9.2.0 が入手可能な OSDN は、サービス終了するという話があったはずで…。サービス終了が中止になったという報道も見かけたけれど、今までの不安定な状況を鑑みれば、今後どうなるのか予測がつかない。将来的には Windows上で動作する MinGW gcc 9.2.0 が入手できなくなる可能性が高いだろうなと。
そもそも、GLFWの公式配布版バイナリに同梱されている README.md には、「MinGW (built with GCC 9.2.0)」という記述があった。gcc 6.3.0 ではなく gcc 9.2.0 の利用を前提としたバイナリだったらしい…。
しかし、MinGW gcc 9.2.0 が入手可能な OSDN は、サービス終了するという話があったはずで…。サービス終了が中止になったという報道も見かけたけれど、今までの不安定な状況を鑑みれば、今後どうなるのか予測がつかない。将来的には Windows上で動作する MinGW gcc 9.2.0 が入手できなくなる可能性が高いだろうなと。
◎ MSYS2を使えばハマらずに済む :
GLFW を使って実験するなら、MSYS2 + gcc 13.2.0 を使ったほうがいいのかもしれない。そちらなら、-static -lglfw3 の指定で、glfw3.dll を必要としない実行形式を生成できる。
また、MSYS2用パッケージとして GLFW も用意されているので、公式サイトからバイナリをDLして手作業でコピーして、といったこともしなくて済む。
$ objdump -p 01_helloglfw.exe | grep dll DLL Name: GDI32.dll DLL Name: KERNEL32.dll DLL Name: msvcrt.dll DLL Name: OPENGL32.dll DLL Name: SHELL32.dll DLL Name: USER32.dll
また、MSYS2用パッケージとして GLFW も用意されているので、公式サイトからバイナリをDLして手作業でコピーして、といったこともしなくて済む。
$ pacman -Ss glfw ... mingw32/mingw-w64-i686-glfw 3.3.9-2 [インストール済み] A free, open source, portable framework for OpenGL application development (mingw-w64) mingw64/mingw-w64-x86_64-glfw 3.3.9-2 [インストール済み] A free, open source, portable framework for OpenGL application development (mingw-w64) ...
◎ 公式配布版 GLFW のバイナリについて :
glfw-3.3.9.bin.WIN32.zip までは MinGW 9.2.0 用のライブラリファイル (lib-mingw/) が入っているが、glfw-3.3.10.bin.WIN32.zip 以降は、lib-mingw-w64 しか入っていない。
◎ テクスチャ画像読み込み機能が無くなっていた :
GLFWはテクスチャ画像の読み込み機能があるという話を見かけて気になっていたのだけど、ググってみたらそれは昔の話のようで、glfw3 では削除されていたらしい。
_GLFW: Moving from GLFW 2 to 3
ごっそり無くなってるなあ…。
_GLFW: Moving from GLFW 2 to 3
Removed functions
glfwReadImage, glfwReadMemoryImage, glfwFreeImage, glfwLoadTexture2D, glfwLoadMemoryTexture2D and glfwLoadTextureImage2D.
ごっそり無くなってるなあ…。
[ ツッコむ ]
以上です。