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

从百度空间

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值