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

来源:互联网 发布:stc单片机程序烧录 编辑:程序博客网 时间:2024/06/05 09:37

从网上下载了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



阅读全文
0 0
原创粉丝点击