2022/09/08(木) [n年前の日記]
#3 [prog][windows] MinGWでfreeglutを使ってみた
Windows10 x64 21H2 + MinGW (gcc 9.2.0) で freeglut を使ってみたい。
freeglut というのは、OpenGL を多少は簡単に使えるようにしてくれるツールキット。元々は GLUT というツールキットがあったのだけど、バグがまだあるのに開発が止まって放置状態になったそうで、その代替として登場したのが freeglut らしい。
さておき。あくまで MinGW (gcc 9.2.0) を使って作業してみる。MinGW-w64 (+ MSYS2) ではなくて、MinGW (+ MSYS)。
MinGW についてはインストール済みで、既に利用できる状態になっているものとする。
freeglut というのは、OpenGL を多少は簡単に使えるようにしてくれるツールキット。元々は GLUT というツールキットがあったのだけど、バグがまだあるのに開発が止まって放置状態になったそうで、その代替として登場したのが freeglut らしい。
さておき。あくまで MinGW (gcc 9.2.0) を使って作業してみる。MinGW-w64 (+ MSYS2) ではなくて、MinGW (+ MSYS)。
MinGW についてはインストール済みで、既に利用できる状態になっているものとする。
◎ freeglutのバイナリの入手。 :
以下のページが参考になった。
_MinGW + OpenGL - 日々量産
_freeglut Windows Development Libraries
上記の英語ページの、freeglut 3.0.0 MinGW Package と書いてあるところの少し下、Download freeglut 3.0.0 for MinGW をクリックして、freeglut-MinGW-3.0.0-1.mp.zip を入手する。
_MinGW + OpenGL - 日々量産
_freeglut Windows Development Libraries
上記の英語ページの、freeglut 3.0.0 MinGW Package と書いてあるところの少し下、Download freeglut 3.0.0 for MinGW をクリックして、freeglut-MinGW-3.0.0-1.mp.zip を入手する。
◎ MinGWの中にコピー。 :
freeglut-MinGW-3.0.0-1.mp.zip を解凍すると、bin/, include/, lib/ というフォルダがあるので、中に入ってるファイル群を、MinGWインストールフォルダ内の同名フォルダの中にコピーする。ちなみに、x64 というフォルダも入ってるけれど、それは64bit用。MinGW は 32bit なので、x64フォルダの中身は無視していい。
今回は以下のファイルをコピーした。
ちなみに、MSYS2 + MinGW-w64 を使っている場合は、パッケージとして freeglut が用意されているので、pacman を使ってインストールができるらしい。
_Base Package: mingw-w64-freeglut - MSYS2 Packages
_Package: mingw-w64-x86_64-freeglut - MSYS2 Packages
_Package: mingw-w64-i686-freeglut - MSYS2 Packages
今回は以下のファイルをコピーした。
bin/freeglut.dll include/GL/freeglut.h include/GL/freeglut_ext.h include/GL/freeglut_std.h include/GL/glut.h lib/libfreeglut.a lib/libfreeglut_static.a
ちなみに、MSYS2 + MinGW-w64 を使っている場合は、パッケージとして freeglut が用意されているので、pacman を使ってインストールができるらしい。
_Base Package: mingw-w64-freeglut - MSYS2 Packages
_Package: mingw-w64-x86_64-freeglut - MSYS2 Packages
_Package: mingw-w64-i686-freeglut - MSYS2 Packages
◎ 使ってみる。 :
使い方は以下で説明されてる。
_Using freeglut or GLUT with MinGW
以下で配布されてるサンプルを利用して、コンパイルできるか試してみる。
_TransmissionZero/Hello-GLUT: A very simple "Hello World!" GLUT application demonstrating how to write OpenGL applications in C with MinGW and MSVC.
上記のサンプルは3ファイルに分かれているけど、別に1ファイルでもいいよなと思えてきた。修正して、1ファイルにしてみた。
_hello_glut.c
コンパイルは以下。hello_glut.exe が生成される。
hello_glut.exe を実行して、赤い四角が表示されたらOK。ちなみに、ESCキーを押すとウインドウが閉じる。
これで、freeglutを使っているCソースを、MinGWでコンパイル/ビルドできる状態になった。
_Using freeglut or GLUT with MinGW
以下で配布されてるサンプルを利用して、コンパイルできるか試してみる。
_TransmissionZero/Hello-GLUT: A very simple "Hello World!" GLUT application demonstrating how to write OpenGL applications in C with MinGW and MSVC.
上記のサンプルは3ファイルに分かれているけど、別に1ファイルでもいいよなと思えてきた。修正して、1ファイルにしてみた。
_hello_glut.c
#include <stdlib.h> #include <GL/glut.h> /* Keyboard callback function */ void keyboard(unsigned char key, int x, int y) { switch (key) { /* Exit on escape key press */ case '\x1B': { exit(EXIT_SUCCESS); break; } } } /* Display callback function */ void display() { glClear(GL_COLOR_BUFFER_BIT); /* Display a red square */ glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_POLYGON); glVertex2f(-0.5f, -0.5f); glVertex2f(0.5f, -0.5f); glVertex2f(0.5f, 0.5f); glVertex2f(-0.5f, 0.5f); glEnd(); glFlush(); } /* Main method */ int main(int argc, char** argv) { glutInit(&argc, argv); /* Create a single window with a keyboard and display callback */ glutCreateWindow("GLUT Test"); glutKeyboardFunc(&keyboard); glutDisplayFunc(&display); /* Run the GLUT event loop */ glutMainLoop(); return EXIT_SUCCESS; }
コンパイルは以下。hello_glut.exe が生成される。
# スタティックリンクしない場合。 gcc hello_glut.c -o hello_glut.exe -lfreeglut -lopengl32 -lwinmm -lgdi32 -mwindows # スタティックリンクする場合。 gcc hello_glut.c -o hello_glut.exe -D FREEGLUT_STATIC -lfreeglut_static -lopengl32 -lwinmm -lgdi32 -mwindows
- スタティックリンクしない場合は、実行ファイルのサイズは小さくなるけれど、動作には freeglut.dll が必要になる。
- スタティックリンクする場合は、実行ファイルが freeglut.dll の中身を含んでいるので、freeglut.dll が無くても動く。ファイルサイズは少し大きくなる。
hello_glut.exe を実行して、赤い四角が表示されたらOK。ちなみに、ESCキーを押すとウインドウが閉じる。
これで、freeglutを使っているCソースを、MinGWでコンパイル/ビルドできる状態になった。
[ ツッコむ ]
以上です。