mieki256's diary



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

gcc 6.3.0利用時の注意点 :

一般的には、gcc で glfw3 を使ったソースをコンパイルする場合、-lglfw3 を指定すればリンクができるはずなのだけど…。

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 が入手できなくなる可能性が高いだろうなと。

MSYS2を使えばハマらずに済む :

GLFW を使って実験するなら、MSYS2 + gcc 13.2.0 を使ったほうがいいのかもしれない。そちらなら、-static -lglfw3 の指定で、glfw3.dll を必要としない実行形式を生成できる。
$ 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
Removed functions
glfwReadImage, glfwReadMemoryImage, glfwFreeImage, glfwLoadTexture2D, glfwLoadMemoryTexture2D and glfwLoadTextureImage2D.

GLFW: Moving from GLFW 2 to 3 より


ごっそり無くなってるなあ…。

以上です。

過去ログ表示

Prev - 2024/02 - 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

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project