ここんところこんなのばっかですね。SDLもいいけど、結局Windows用とX用にそれぞれべた書きしたほうがシンプルでいいんじゃないかという気がしてきた。今win32apiのほうのウィンドウを作成しているところです。
まずは、ビルドしたいソースファイル一式。
main.cpp
07 | const char *APP_NAME = "Hoge" ; |
12 | LRESULT CALLBACK MyWndProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) |
20 | return DefWindowProc(hWnd, msg, wp, lp); |
23 | int WINAPI WinMain( HINSTANCE hInst, HINSTANCE , LPSTR , int ) |
26 | memset (&wc, 0, sizeof (wc)); |
27 | wc.lpfnWndProc = MyWndProc; |
29 | wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); |
30 | wc.hCursor = LoadCursor(NULL, IDC_ARROW); |
31 | wc.hbrBackground = ( HBRUSH )GetSysColorBrush(COLOR_3DFACE); |
32 | wc.lpszClassName = APP_NAME; |
33 | if (!RegisterClass(&wc)) return -1; |
36 | SetRect(&r, 0, 0, APP_W, APP_H); |
37 | AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, FALSE); |
39 | HWND hWnd = CreateWindow(wc.lpszClassName, wc.lpszClassName, |
41 | CW_USEDEFAULT, CW_USEDEFAULT, |
42 | r.right - r.left, r.bottom - r.top, |
43 | NULL, NULL, wc.hInstance, NULL); |
44 | ShowWindow(hWnd, SW_SHOW); |
50 | while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0) |
52 | DispatchMessage(&msg); |
54 | if (msg.message == WM_QUIT) break ; |
57 | HDC hdc = GetGLDC(hWnd); |
58 | glClear(GL_COLOR_BUFFER_BIT); |
60 | glColor3f(1, 0, 0); glVertex2f(-0.8f, -0.8f); |
61 | glColor3f(0, 1, 0); glVertex2f( 0.8f, 0.8f); |
62 | glColor3f(0, 0, 1); glVertex2f( 0.8f, -0.8f); |
66 | ReleaseGLDC(hWnd, hdc); |
utilGL.hpp
01 | #ifndef UTILGL_HPP_4bf0ab006de93374665ede990dbc4458 |
02 | #define UTILGL_HPP_4bf0ab006de93374665ede990dbc4458 |
06 | HDC GetGLDC( HWND hWnd); |
07 | void ReleaseGLDC( HWND hWnd, HDC hdc); |
10 | #endif//UTILGL_HPP_4bf0ab006de93374665ede990dbc4458 |
utilGL.cpp
03 | static HGLRC hGLRC = NULL; |
09 | static PIXELFORMATDESCRIPTOR pfd = |
11 | sizeof (PIXELFORMATDESCRIPTOR), 1, |
12 | PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, |
14 | 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, |
15 | PFD_MAIN_PLANE, 0, 0, 0, 0 |
18 | pf = ChoosePixelFormat(hdc, &pfd); |
19 | SetPixelFormat(hdc, pf, &pfd); |
20 | if (!hGLRC) hGLRC = wglCreateContext(hdc); |
21 | wglMakeCurrent(hdc, hGLRC); |
26 | void ReleaseGLDC( HWND hWnd, HDC hdc) |
28 | wglMakeCurrent(hdc, 0); |
34 | if (!hGLRC) wglDeleteContext(hGLRC); |
Makefile
02 | srcs = $(wildcard *.cpp) |
03 | objs = $(subst .cpp,.o,$(srcs)) |
06 | CPPFLAGS = -I /usr/include/opengl |
08 | LDFLAGS = -mno-cygwin -lopengl32 -lgdi32 |
12 | $(CXX) $^ $(LDFLAGS) $(OUTPUT_OPTION) |
21 | $(RM) $(program) $(objs) *~ |
以上4ファイル。
実行結果
さて、ここから覚え書き。
Makefileにある
$(CXX) $^ $(LDFLAGS) $(OUTPUT_OPTION)
ですが、こいつは展開されると、
g++ main.o utilGL.o -mno-cygwin -lopengl32 -lgdi32 -o glvertex
になります。
実はこの行、修正したものでして、修正前の状態だと
$(LINK.o) $^ $(OUTPUT_OPTION)
でした。これは、展開されると
$(CC) $(LDFLAGS) $(TARGET_ARCH) $(OUTPUT_OPTION)
g++ -mno-cygwin -lopengl32 -lgdi32 main.o utilGL.o -o glvertex
となり、リンクエラーを起こしてしまいます。原因はおそらく、リンクするオブジェクト(main.o utilGL.o)より前に-lopengl32 -lgdi32を書いてしまったことかと思います。
詳しくはよくわからないのですが、
-lオプションをつけた依存ファイルは、ローカルの依存ファイル(main.o utilGL.o)より後ろに書いておくのが正解なようです。
参考サイト
Win32API+OpenGL(GLUTに頼らない方法)
GDI関係のライブラリ解決に役立った
GNU Make関数リファレンス
GNU Makeの使い方
0 件のコメント:
コメントを投稿