现象:
D:\CodeBlocks\MinGW\include\GL\freeglut_std.h|610|undefined reference to `__imp____glutInitWithExit@12'|
obj\Debug\main.o||In function `glutCreateWindow_ATEXIT_HACK':|
D:\CodeBlocks\MinGW\include\GL\freeglut_std.h|612|undefined reference to `__imp____glutCreateWindowWithExit@8'|
obj\Debug\main.o||In function `glutCreateMenu_ATEXIT_HACK':|
D:\CodeBlocks\MinGW\include\GL\freeglut_std.h|614|undefined reference to `__imp____glutCreateMenuWithExit@8'|
原理:
/* Comment from glut.h of classic GLUT:
Win32 has an annoying issue where there are multiple C run-time
libraries (CRTs). If the executable is linked with a different CRT
from the GLUT DLL, the GLUT DLL will not share the same CRT static
data seen by the executable. In particular, atexit callbacks registered
in the executable will not be called if GLUT calls its (different)
exit routine). GLUT is typically built with the
"/MD" option (the CRT with multithreading DLL support), but the Visual
C++ linker default is "/ML" (the single threaded CRT).
One workaround to this issue is requiring users to always link with
the same CRT as GLUT is compiled with. That requires users supply a
non-standard option. GLUT 3.7 has its own built-in workaround where
the executable's "exit" function pointer is covertly passed to GLUT.
GLUT then calls the executable's exit function pointer to ensure that
any "atexit" calls registered by the application are called if GLUT
needs to exit.
Note that the __glut*WithExit routines should NEVER be called directly.
To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */
理解:
大致的意思是:win32有一个让人恼火的地方:同时存在多个C runtime库(CRT)。而编译好的GLUT.dll可能会连接到和编译GLUT.dll时用到的CRT不同的CRT,这样就会出现一些数据、函数之类不被调用的现象,尤其是atexit回调函数。为了应对这个问题,GLUT做了一个权宜之计或成变通处理(WorkAround),内建了一个exit函数指针,GLUT需要退出时,就内部调用这个函数。
这些glut*exit函数不应该直接被用户调用。所以说如果你发现了连接的时候,连接到了,就#define GLUT_DISABLE_ATEXIT_HACK,禁用这个workaround就行了。
但是我还是有些不理解:为什么能连接到了呢?连接的那些exit函数难道没有被实现?