您的位置:首页 > 运维架构

mingw-w64 i686-7.1.0编译OpenGL超级宝典第五版示例程序

2017-07-02 17:08 288 查看
从网上下载了OpenGL超级宝典第五版的示例代码,代码中只提供了VS和Linux下的编译文件,但直接使用Linux下的Makefile进行编译,发现会报错。为了解决编译的问题,也颇费了写周折。因此写了这篇文章,以帮助遇到同样问题的人。

为了在windows下编译,需对Makefile进行修改。

打开前几个示例的Makefile,发现里面的内容基本一致。由于原本是用于Linux下编译使用,因此链接使用的一些库文件会找不到,需修改为在windows下运行时链接的库文件。又由于使用的mingw已经安装了最新的freeglut和glew库及头文件等,因此去掉了原始文件中glew的编译,并将glut改为freeglut。修改后的Makefile如下:

MAIN = Block

SRCPATH = ../../../Src/Chapter01/$(MAIN)/

SHAREDPATH = ../../../Src/GLTools/src/

SHAREDINCPATH = ../../../Src/GLTools/include/

LIBDIRS = $(LDFLAGS) -L$(SHAREDPATH)

INCDIRS = -I$(SHAREDINCPATH) $(CPPFLAGS)

CC = g++

CFLAGS = $(COMPILERFLAGS) -g $(INCDIRS)

LIBS = -lglew32 -lfreeglut -lopengl32 -lglu32 -lm

prog : $(MAIN)

$(MAIN).o : $(SRCPATH)$(MAIN).cpp

GLTools.o    : $(SHAREDPATH)GLTools.cpp

GLBatch.o    : $(SHAREDPATH)GLBatch.cpp

GLTriangleBatch.o    : $(SHAREDPATH)GLTriangleBatch.cpp

GLShaderManager.o    : $(SHAREDPATH)GLShaderManager.cpp

math3d.o    : $(SHAREDPATH)math3d.cpp

$(MAIN) : $(MAIN).o

    $(CC) $(CFLAGS) -o $(MAIN) $(LIBDIRS) $(SRCPATH)$(MAIN).cpp $(SHAREDPATH)GLTools.cpp $(SHAREDPATH)GLBatch.cpp $(SHAREDPATH)GLTriangleBatch.cpp $(SHAREDPATH)GLShaderManager.cpp $(SHAREDPATH)math3d.cpp $(LIBS)

clean:

    rm -f *.o

修改后由于使用的是动态链接库,因此需要将源代码中定义的FREEGLUT_STATIC取消才能正确链接

#include <GLTools.h>    // OpenGL toolkit

#include <GLMatrixStack.h>

#include <GLFrame.h>

#include <GLFrustum.h>

#include <GLBatch.h>

#include <GLGeometryTransform.h>

#include <math.h>

#ifdef __APPLE__

#include <glut/glut.h>

#else

// #define FREEGLUT_STATIC

#include <GL/glut.h>

#endif

如此便能在windows下使用mingw-w64编译蓝宝书中的示例了,效果如下(程序用到的纹理图片在源代码目录,需要拷贝到可执行文件目录下)



如果需要使用静态库,链接时还需要链接额外链接winmm和gdi32两个库,否则就会像报一堆错误:

$ make

g++  -g -I../../../Src/GLTools/include/  -o Blending  -L../../../Src/GLTools/src/ ../../../Src/Chapter03/Blending/Blending.cpp ../../../Src/GLTools/src/GLTools.cpp ../../../Src/GLTools/src/GLBatch.cpp ../../../Src/GLTools/src/GLTriangleBatch.cpp ../../../Src/GLTools/src/GLShaderManager.cpp
../../../Src/GLTools/src/math3d.cpp -lglew32 -lfreeglut_static -lopengl32 -lglu32 -lm

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_display_mswin.c.obj):fg_display_mswin.c:(.text+0x69): undefined reference to `_imp__SwapBuffers@4'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_init_mswin.c.obj):fg_init_mswin.c:(.text+0x1a7): undefined reference to `_imp__GetDeviceCaps@8'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_init_mswin.c.obj):fg_init_mswin.c:(.text+0x1c4): undefined reference to `_imp__GetDeviceCaps@8'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_init_mswin.c.obj):fg_init_mswin.c:(.text+0x217): undefined reference to `_imp__CreateDCA@16'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_init_mswin.c.obj):fg_init_mswin.c:(.text+0x23c): undefined reference to `_imp__GetDeviceCaps@8'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_init_mswin.c.obj):fg_init_mswin.c:(.text+0x259): undefined reference to `_imp__GetDeviceCaps@8'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_init_mswin.c.obj):fg_init_mswin.c:(.text+0x276): undefined reference to `_imp__GetDeviceCaps@8'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_init_mswin.c.obj):fg_init_mswin.c:(.text+0x293): undefined reference to `_imp__GetDeviceCaps@8'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_init_mswin.c.obj):fg_init_mswin.c:(.text+0x2a8): undefined reference to `_imp__DeleteDC@4'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_init_mswin.c.obj):fg_init_mswin.c:(.text+0x2c7): undefined reference to `_imp__timeBeginPeriod@4'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_init_mswin.c.obj):fg_init_mswin.c:(.text+0x33e): undefined reference to `_imp__timeEndPeriod@4'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_joystick_mswin.c.obj):fg_joystick_mswin.c:(.text+0x79): undefined reference to `_imp__joyGetPosEx@8'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_joystick_mswin.c.obj):fg_joystick_mswin.c:(.text+0x55a): undefined reference to `_imp__joyGetDevCapsA@12'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_main_mswin.c.obj):fg_main_mswin.c:(.text+0x60): undefined reference to `_imp__timeGetTime@0'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_main_mswin.c.obj):fg_main_mswin.c:(.text+0x82): undefined reference to `_imp__timeGetTime@0'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_state_mswin.c.obj):fg_state_mswin.c:(.text+0x341): undefined reference to `_imp__GetPixelFormat@4'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_state_mswin.c.obj):fg_state_mswin.c:(.text+0x36d): undefined reference to `_imp__DescribePixelFormat@16'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_state_mswin.c.obj):fg_state_mswin.c:(.text+0x62b): undefined reference to `_imp__GetPixelFormat@4'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_window_mswin.c.obj):fg_window_mswin.c:(.text+0x445): undefined reference to `_imp__GetDeviceCaps@8'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_window_mswin.c.obj):fg_window_mswin.c:(.text+0x753): undefined reference to `_imp__CreateDCA@16'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_window_mswin.c.obj):fg_window_mswin.c:(.text+0x795): undefined reference to `_imp__ChoosePixelFormat@8'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_window_mswin.c.obj):fg_window_mswin.c:(.text+0x8c5): undefined reference to `_imp__SetPixelFormat@12'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_window_mswin.c.obj):fg_window_mswin.c:(.text+0xa23): undefined reference to `_imp__SetPixelFormat@12'

D:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.1.0/../../../../i686-w64-mingw32/lib/../lib/libfreeglut_static.a(fg_window_mswin.c.obj):fg_window_mswin.c:(.text+0xa4f): undefined reference to `_imp__DeleteDC@4'

collect2.exe: error: ld returned 1 exit status

Makefile:22: recipe for target 'Blending' failed

make: *** [Blending] Error 1

同时源代码中删掉的FREEGLUT_STATIC宏也要加回去,不然也是一堆错

g++  -g -I../../../Src/GLTools/include/  -o Blending  -L../../../Src/GLTools/src/ ../../../Src/Chapter03/Blending/Blending.cpp ../../../Src/GLTools/src/GLTools.cpp ../../../Src/GLTools/src/GLBatch.cpp ../../../Src/GLTools/src/GLTriangleBatch.cpp ../../../Src/GLTools/src/GLShaderManager.cpp
../../../Src/GLTools/src/math3d.cpp -lglew32 -lfreeglut_static -lopengl32 -lglu32 -lwinmm -lgdi32 -lm

D:\msys32\tmp\ccaVO70s.o: In function `glutInit_ATEXIT_HACK':

D:/msys32/mingw32/i686-w64-mingw32/include/GL/freeglut_std.h:637: undefined reference to `_imp____glutInitWithExit@12'

D:\msys32\tmp\ccaVO70s.o: In function `glutCreateWindow_ATEXIT_HACK':

D:/msys32/mingw32/i686-w64-mingw32/include/GL/freeglut_std.h:639: undefined reference to `_imp____glutCreateWindowWithExit@8'

D:\msys32\tmp\ccaVO70s.o: In function `glutCreateMenu_ATEXIT_HACK':

D:/msys32/mingw32/i686-w64-mingw32/include/GL/freeglut_std.h:641: undefined reference to `_imp____glutCreateMenuWithExit@8'

D:\msys32\tmp\ccaVO70s.o: In function `Z11SpecialKeysiii':

E:\projects\opengl\OpenGL_supperbible\Linux\Chapter03\Blending/../../../Src/Chapter03/Blending/Blending.cpp:126: undefined reference to `_imp__glutPostRedisplay@0'

D:\msys32\tmp\ccaVO70s.o: In function `Z11RenderScenev':

E:\projects\opengl\OpenGL_supperbible\Linux\Chapter03\Blending/../../../Src/Chapter03/Blending/Blending.cpp:168: undefined reference to `_imp__glutSwapBuffers@0'

D:\msys32\tmp\ccaVO70s.o: In function `main':

E:\projects\opengl\OpenGL_supperbible\Linux\Chapter03\Blending/../../../Src/Chapter03/Blending/Blending.cpp:188: undefined reference to `_imp__glutInitDisplayMode@4'

E:\projects\opengl\OpenGL_supperbible\Linux\Chapter03\Blending/../../../Src/Chapter03/Blending/Blending.cpp:189: undefined reference to `_imp__glutInitWindowSize@8'

E:\projects\opengl\OpenGL_supperbible\Linux\Chapter03\Blending/../../../Src/Chapter03/Blending/Blending.cpp:200: undefined reference to `_imp__glutReshapeFunc@4'

E:\projects\opengl\OpenGL_supperbible\Linux\Chapter03\Blending/../../../Src/Chapter03/Blending/Blending.cpp:201: undefined reference to `_imp__glutDisplayFunc@4'

E:\projects\opengl\OpenGL_supperbible\Linux\Chapter03\Blending/../../../Src/Chapter03/Blending/Blending.cpp:202: undefined reference to `_imp__glutSpecialFunc@4'

E:\projects\opengl\OpenGL_supperbible\Linux\Chapter03\Blending/../../../Src/Chapter03/Blending/Blending.cpp:206: undefined reference to `_imp__glutMainLoop@0'

collect2.exe: error: ld returned 1 exit status

Makefile:22: recipe for target 'Blending' failed

make: *** [Blending] Error 1

修改后的Makefile如下:

MAIN = Blending

SRCPATH = ../../../Src/Chapter03/$(MAIN)/

SHAREDPATH = ../../../Src/GLTools/src/

SHAREDINCPATH = ../../../Src/GLTools/include/

LIBDIRS = $(LDFLAGS) -L$(SHAREDPATH)

INCDIRS = -I$(SHAREDINCPATH) $(CPPFLAGS)

CC = g++

CFLAGS = $(COMPILERFLAGS) -g $(INCDIRS)

LIBS = -lglew32 -lfreeglut_static -lopengl32 -lglu32 -lwinmm -lgdi32 -lm

prog : $(MAIN)

$(MAIN).o : $(SRCPATH)$(MAIN).cpp

GLTools.o    : $(SHAREDPATH)GLTools.cpp

GLBatch.o    : $(SHAREDPATH)GLBatch.cpp

GLTriangleBatch.o    : $(SHAREDPATH)GLTriangleBatch.cpp

GLShaderManager.o    : $(SHAREDPATH)GLShaderManager.cpp

math3d.o    : $(SHAREDPATH)math3d.cpp

$(MAIN) : $(MAIN).o

    $(CC) $(CFLAGS) -o $(MAIN) $(LIBDIRS) $(SRCPATH)$(MAIN).cpp $(SHAREDPATH)GLTools.cpp $(SHAREDPATH)GLBatch.cpp $(SHAREDPATH)GLTriangleBatch.cpp $(SHAREDPATH)GLShaderManager.cpp $(SHAREDPATH)math3d.cpp $(LIBS)

clean:

    rm -f *.o

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mingw opengl