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