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

从网上下载了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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用 MinGW-w64 工具链在 Windows 上编译 Linux 程序,需要使用 CGO 编译器。CGO 是 Go 语言的 C 语言调用接口,它可以让 Go 语言调用 C 语言的函数和库。通过 CGO 编译器,我们可以在 Windows 上编写 Go 代码,然后使用 MinGW-w64 工具链编译 C 语言代码,最后将 Go 代码和 C 代码链接起来生成 Linux 可执行文件。 具体操作步骤如下: 1. 下载并安装 MinGW-w64 工具链,下载地址:https://sourceforge.net/projects/mingw-w64/ 2. 配置 MinGW-w64 工具链的环境变量,将 MinGW-w64 的 bin 目录添加到系统 PATH 环境变量中。 3. 在 Go 代码中使用 CGO,例如: ``` package main /* #include <stdio.h> void sayHello() { printf("Hello, World!\n"); } */ import "C" func main() { C.sayHello() } ``` 这个例子演示了如何在 Go 代码中调用 C 语言的函数。在 Go 代码中,我们需要使用 `import "C"` 导入 C 语言的库和函数。 4. 编译 C 语言代码,生成静态库文件,例如: ``` x86_64-w64-mingw32-gcc -c -o mylib.o mylib.c x86_64-w64-mingw32-ar rcs mylib.a mylib.o ``` 这个命令会生成静态库文件 `mylib.a`,它包含了 C 语言代码的编译结果。 5. 编译 Go 代码,使用 CGO 编译器链接 C 语言的静态库文件,例如: ``` CGO_ENABLED=1 GOOS=linux GOARCH=amd64 CC=x86_64-w64-mingw32-gcc go build -o myprogram main.go ``` 这个命令会生成 Linux 平台的可执行文件 `myprogram`,它包含了 Go 代码和 C 语言代码的链接结果。 6. 将生成的 Linux 可执行文件从 Windows 复制到 Linux 环境中运行,例如: ``` scp myprogram user@server:/path/to/myprogram ssh user@server "/path/to/myprogram" ``` 其中,`user` 是 Linux 系统的用户名,`server` 是 Linux 系统的 IP 地址或域名,`/path/to/myprogram` 是 Linux 系统中的路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值