C++Builder6でGLUT

今後のためにGLUTの使い方に慣れておこうと思う。

参考

GLUTによる「手抜き」OpenGL入門

GLUTのダウンロード
Nate Robins - OpenGL - GLUT for Win32

Borland用glut32.libを作る

ダウンロードしたglut-3.7.6-bin.zipを解凍したら、README-win32.txtのBORLAND NOTES:の手順に従ってBorland用のライブラリを作る。
コマンドプロンプトウィンドウを開いて解凍したフォルダに移動し、以下のコマンドを実行する。

implib.exe glut32.lib glut32.dll

今回はこれでちゃんと作れたが、うまくいかない場合は

IMPLIB glut32.lib glut32.def

とするとよいらしい。

開発環境へコピー

glut32.lib を C:\Program Files\Borland\CBuilder6\Lib にコピー
glut.h を C:\Program Files\Borland\CBuilder6\Include\Gl にコピー
glut32.dll を C:\WINDOWS\system32 にコピー

テスト

適当なフォルダに、以下のようなC言語のソースファイル gltest.c を用意する。

#include 

void display(void)
{
}

int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutCreateWindow(argv[0]);
  glutDisplayFunc(display);
  glutMainLoop();
  return 0;
}

DOS窓でこのフォルダに移動し、ビルドする。

bcc32.ext gltest.c

成功したら、gltest.exeが出来ている。
gltest.exeを実行すると、ウィンドウが表示される。ウィンドウの内側に起動時の背景が描画され、ウィンドウの位置を変えても再描画されないが、それで正常なので心配しないように。

C++Builderで起こるいくつかの問題について

http://uri.sakura.ne.jp/~cosmic/yuno/lab/gl_intro.html
に説明がある。

オーバーロード関数群の中の 1 つだけしか "C" にできない
C++コンパイルしたときに起きるエラーです。 stdlib.h で std::exit を extern "C" で宣言してるのと、 glut.h が ::exit を extern "C" で宣言してるのがぶつかって起きるエラーです。 "C" ではオーバーロード出来ませんから。 glut.h の exit を宣言してる部分をコメント化して解決。

単純にコメントアウトするとCでコンパイルしたときにエラーになるので、
#ifndef __cplusplus が定義されていない場合はexternが有効になるようにした。

#if defined(_WIN32)
# ifndef GLUT_BUILDING_LIB
# ifndef __cplusplus        //追加
extern _CRTIMP void __cdecl exit(int);
# endif                     //追加
# endif
#else