undefined reference to glut*WithExit之类的函数问题的原因及解决

来源:互联网 发布:王者荣耀女娲攻略知乎 编辑:程序博客网 时间:2024/06/06 02:37

从百度空间

翻出来的文章,希望大家不会在这样的问题上,浪费很多时间。

undefined reference to glut*WithExit之类的函数问题的原因及解决

现象:

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函数难道没有被实现?