【一步步学OpenGL(1) -《打开一个窗口》--实战1】

@[TOC](一步步学OpenGL(1) -《打开一个窗口》–实战1)

指导文档

OpenGL官网
右侧链接 Getting Started with OpenGL
Tutorials and How To Guides
OpenGL Step by Step (using C++, FreeGLUT and GLEW)
实际跳转到 https://ogldev.org/ 点中文
跳转到目录:一步步学OpenGL3.3+ OpenGL基础图形学原理实践
一步步学OpenGL(1) -《打开一个窗口》

编译环境

版本 Windows 10 21H2
操作系统内部版本 19044.1826
IDE界面:Dev C++ 6.3
编译软件:从strawberry-perl-5.32.1.1-64bit-portable里面取的x86_64-w64-mingw32,从Dev C++指定编译目录会自动配置相关的路径

编译gult库

老版本2.8.1下载了30%,没有成功,老跳转到新版本freeglut-3.4.0.tar.gz。没有lib文件了,只能自己编译。
解压freeglut-3.4.0.tar.gz,从README.md开始读(提到备用方法,参考altbuild/README.md)。
README.cmake 参考How to build freeglut with CMake on Windows (MS Visual Studio)进行操作。大概步骤,下载并安装cmake,指定源和目的目录,点两次Configure 后点Generate。第12步后面还有一个compile as usual,由于没有经验,最终尝试运行mingw32-make.exe成功了。

D:\xxx\freeglut>mingw32-make.exe
Scanning dependencies of target freeglut
[ 1%] Building C object CMakeFiles/freeglut.dir/src/fg_callbacks.c.obj

[100%] Built target 3dview_static

cmake配置的参数CMAKE_INSTALL_PREFIX,指向C:/Program Files (x86)/freeglut,实际并未生成该目录。

配置glut环境

README.win32 参考Installing the Libraries with MSVC,主要包括:
拷贝头文件:GL目录下 “freeglut.h”, “freeglut_ext.h”, “freeglut_std.h”, and
“glut.h” ,拷贝要包含GL目录。
拷贝库文件:“freeglut.lib” or “freeglut_static.lib” 实际生成的文件是

D:\xxx\freeglut\lib 的目录
2022/10/08 17:48 130,770 libfreeglut.dll.a
2022/10/08 17:48 594,084 libfreeglut_static.a

拷贝动态链接文件:“freeglut.dll”

编译样例报错:undefined reference to __imp___glutInitWithExit

完整报错为

Compiling single file...
--------
- Filename: C:\Users\sometwo\Documents\xGlut\glut2.cpp
- Compiler Name: strawberry

Processing C++ source file...
--------
- C++ Compiler: D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\bin\g++.exe
- Command: g++.exe "C:\Users\sometwo\Documents\xGlut\glut2.cpp" -o "C:\Users\sometwo\Documents\xGlut\glut2.exe"  -I"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\include" -I"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\x86_64-w64-mingw32\include" -I"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\lib\gcc\x86_64-w64-mingw32\8.3.0\include" -I"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\lib\gcc\x86_64-w64-mingw32\8.3.0\include\c++" -L"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\lib" -L"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\x86_64-w64-mingw32\lib" -static-libgcc -lgraphics64  -lgdiplus -luuid -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32 -lwinmm
D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0x25): undefined reference to `__imp___glutInitWithExit'

D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0x4c): undefined reference to `__imp___glutCreateWindowWithExit'

D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0x72): undefined reference to `__imp___glutCreateMenuWithExit'
D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0xa3): undefined reference to `__imp___glutCreateMenuUcallWithExit'
D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0xbf): undefined reference to `__imp_glClear'

D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0xc8): undefined reference to `__imp_glutSwapBuffers'
D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0x101): undefined reference to `__imp_glutInitDisplayMode'
D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0x114): undefined reference to `__imp_glutInitWindowSize'

D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0x127): undefined reference to `__imp_glutInitWindowPosition'

D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0x143): undefined reference to `__imp_glutDisplayFunc'
D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0x15c): undefined reference to `__imp_glClearColor'
D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cccXIKzT.o:glut2.cpp:(.text+0x165): undefined reference to `__imp_glutMainLoop'

collect2.exe: error: ld returned 1 exit status

Compilation results...
--------
- Errors: 1
- Warnings: 0
- Compilation Time: 0.84s

处理方法

参考案例Linker issue with mingw, notepad++ and freeglut,整了这些没有用:

#pragma comment("lib", "*freeglut/glut library name*")
#pragma comment("lib", "opengl32")
#define GLUT_DISABLE_ATEXIT_HACK
#pragma comment ("lib", "winmm")

参考D:\xxx\freeglut\freeglut.pc

Name: glut
Description: A freely licensed and improved alternative to the GLUT library
Version: 3.4.0
Libs: -L${libdir} -lfreeglut
Libs.private: -lopengl32 -lwinmm -lgdi32
Cflags: -I${includedir} -DFREEGLUT_STATIC

给编译器加上参数 -lfreeglut解决,菜单Tool–Compiler Option–General–Add …when calling the linker。
-static-libgcc -lgraphics64 -lgdiplus -luuid -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32 -lwinmm -lfreeglut
其中的-lgraphics64 -lgdiplus -luuid -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32 -lwinmm是安装EGE时配置的,去掉不影响glut。

新的报错及解决方法:undefined reference to __imp_glClear

Processing C++ source file...
--------
- C++ Compiler: D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\bin\g++.exe
- Command: g++.exe "C:\Users\sometwo\Documents\xGlut\glut2.cpp" -o "C:\Users\sometwo\Documents\xGlut\glut2.exe"  -I"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\include" -I"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\x86_64-w64-mingw32\include" -I"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\lib\gcc\x86_64-w64-mingw32\8.3.0\include" -I"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\lib\gcc\x86_64-w64-mingw32\8.3.0\include\c++" -L"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\lib" -L"D:\tool\strawberry-perl-5.32.1.1-64bit-portable\c\x86_64-w64-mingw32\lib" -static-libgcc  -lfreeglut
D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cc7nt76p.o:glut2.cpp:(.text+0xbf): undefined reference to `__imp_glClear'
D:/tool/strawberry-perl-5.32.1.1-64bit-portable/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\sometwo\AppData\Local\Temp\cc7nt76p.o:glut2.cpp:(.text+0x15c): undefined reference to `__imp_glClearColor'

collect2.exe: error: ld returned 1 exit status

尝试在cpp添加#pragma comment(“lib”, “opengl32”)没有效果。
解决方法:加上工具-编译选项,添加-lopengl32编译参数后解决。
最终 -static-libgcc -lfreeglut -lopengl32

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值