#define GLUT_DISABLE_ATEXIT_HACK 是否有必要?由 小码哥发布于

2024-01-12

I use MinGW64 with eclipse编译一个FreeGLUT示例程序。 我收到以下错误。

11:55:58 **** Incremental Build of configuration Debug for project OpenGL ****

信息:内部构建器用于构建 g++ "-ID:\...\3rdPartyLibraries\freeglut\include" "-ID:\...\3rdPartyLibraries\freeglut\lib\x64" -O0 -g3 -Wall -c -fmessage-length=0 -std= c++11 -o“src\LUtil.o”“..\src\LUtil.cpp” g++ "-LD:\...\3rdPartyLibraries\freeglut\lib\x64" -o OpenGL.exe "src\cPoint.o" "src\OpenGL.o" "src\LUtil.o" -lglu32 -lfreeglut_static -lopengl32 -lwinmm -lgdi32 src\LUtil.o:在函数中glutInit_ATEXIT_HACK': D:/.../3rdPartyLibraries/freeglut/include/GL/freeglut_std.h:620: undefined reference toimp_glutInitWithExit' src\LUtil.o:在函数中glutCreateWindow_ATEXIT_HACK': D:/.../3rdPartyLibraries/freeglut/include/GL/freeglut_std.h:622: undefined reference toimp_glutCreateWindowWithExit' src\LUtil.o:在函数中glutCreateMenu_ATEXIT_HACK': D:/.../3rdPartyLibraries/freeglut/include/GL/freeglut_std.h:624: undefined reference toimp_glutCreateMenuWithExit' collect2.exe:错误:ld 返回 1 退出状态

所以我搜索了标题并发现freeglut_std.h:

/* 来自经典 GLUT 的 glut.h 的注释:

Win32 有一个恼人的问题,即有多个 C 运行时 库(CRT)。如果可执行文件与不同的 CRT 链接 从 GLUT DLL 中,GLUT DLL 不会共享相同的 CRT 静态 可执行文件看到的数据。特别是,atexit 回调已注册 如果 GLUT 调用其(不同),则可执行文件中的内容不会被调用 退出例程)。 GLUT 通常是用 “/MD”选项(具有多线程 DLL 支持的 CRT),但 Visual C++ 链接器默认为“/ML”(单线程 CRT)。

此问题的一种解决方法是要求用户始终链接 与 GLUT 编译时使用的 CRT 相同。这需要用户提供一个 非标准选项。 GLUT 3.7 有自己的内置解决方法,其中 可执行文件的“退出”函数指针被秘密传递给 GLUT。 然后 GLUT 调用可执行文件的退出函数指针以确保 如果 GLUT,则调用应用程序注册的任何“atexit”调用 需要退出。

请注意,决不应该直接调用 __glut*WithExit 例程。 为了避免 atexit 解决方法,#define GLUT_DISABLE_ATEXIT_HACK。 */

我不了解技术细节,但显然有一个选项可以禁用它。即#define GLUT_DISABLE_ATEXIT_HACK。 当使用这个定义时,错误消息消失并且可以编译。

所以我想到的问题是:“这是我应该做的事情,还是只是修复一些应该在其他地方修复的东西的糟糕方法?”

由于我缺乏信息学背景,我并不真正理解这个“退出问题”的含义和解决方法。我发现,解决方法的存在可能是有充分理由的,因此禁用它可能并不明智。 那么,设置定义是处理此错误的正确方法,还是只是掩盖了应该在其他地方修复的问题的影响?

我的问题本质上可以归结为:“我应该使用#define GLUT_DISABLE_ATEXIT_HACK还是有其他/更好的方法来解决这个问题?”

另外,如果你能告诉我这方面的理论背景,我也会很感兴趣。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#define GLUT_DISABLE_ATEXIT_HACK 是否有必要?由 小码哥发布于 的相关文章

随机推荐