まずは、ビルドしたいソースファイル一式。
main.cpp
#include <windows.h>
#include <GL/gl.h>
#include "utilGL.hpp"
namespace
{
const char *APP_NAME = "Hoge";
const int APP_W = 400;
const int APP_H = 300;
}
LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wp, lp);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
WNDCLASS wc;
memset(&wc, 0, sizeof(wc));
wc.lpfnWndProc = MyWndProc;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_3DFACE);
wc.lpszClassName = APP_NAME;
if(!RegisterClass(&wc)) return -1;
RECT r;
SetRect(&r, 0, 0, APP_W, APP_H);
AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, FALSE);
HWND hWnd = CreateWindow(wc.lpszClassName, wc.lpszClassName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
r.right - r.left, r.bottom - r.top,
NULL, NULL, wc.hInstance, NULL);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
while(true)
{
MSG msg;
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0)
{
DispatchMessage(&msg);
}
if(msg.message == WM_QUIT) break;
HDC hdc = GetGLDC(hWnd);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3f(1, 0, 0); glVertex2f(-0.8f, -0.8f);
glColor3f(0, 1, 0); glVertex2f( 0.8f, 0.8f);
glColor3f(0, 0, 1); glVertex2f( 0.8f, -0.8f);
glEnd();
glFlush();
SwapBuffers(hdc);
ReleaseGLDC(hWnd, hdc);
}
ExitGL();
return 0;
}
utilGL.hpp#ifndef UTILGL_HPP_4bf0ab006de93374665ede990dbc4458 #define UTILGL_HPP_4bf0ab006de93374665ede990dbc4458 #include <windows.h> #include <GL/gl.h> HDC GetGLDC(HWND hWnd); void ReleaseGLDC(HWND hWnd, HDC hdc); void ExitGL(); #endif//UTILGL_HPP_4bf0ab006de93374665ede990dbc4458utilGL.cpp
#include "utilGL.hpp"
static HGLRC hGLRC = NULL;
HDC GetGLDC(HWND hWnd)
{
HDC hdc;
int pf;
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), 1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,
PFD_MAIN_PLANE, 0, 0, 0, 0
};
hdc = GetDC(hWnd);
pf = ChoosePixelFormat(hdc, &pfd);
SetPixelFormat(hdc, pf, &pfd);
if(!hGLRC) hGLRC = wglCreateContext(hdc);
wglMakeCurrent(hdc, hGLRC);
return hdc;
}
void ReleaseGLDC(HWND hWnd, HDC hdc)
{
wglMakeCurrent(hdc, 0);
ReleaseDC(hWnd, hdc);
}
void ExitGL()
{
if(!hGLRC) wglDeleteContext(hGLRC);
}
Makefileprogram = glvertex
srcs = $(wildcard *.cpp)
objs = $(subst .cpp,.o,$(srcs))
CC := g++
CPPFLAGS = -I /usr/include/opengl
CXXFLAGS = -mno-cygwin
LDFLAGS = -mno-cygwin -lopengl32 -lgdi32
$(program): $(objs)
@echo $(objs)
$(CXX) $^ $(LDFLAGS) $(OUTPUT_OPTION)
%.o: %.cpp
@echo $(srcs)
$(COMPILE.C) $<
.PHONY: clean
clean:
$(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 件のコメント:
コメントを投稿