未解决的外部符号__IMP__GLEWINIT vs __IMP__GLEWINIT@0

unresolved external symbol __imp__glewInit VS __imp__glewInit@0

本文关键字:IMP GLEWINIT GLEWINIT@0 vs 未解决 外部 符号      更新时间:2023-10-16

当我在程序中使用openGL时,使用" glew":未解决的外部符号_ imp _gleWinit(使用glew 1.10时,我就会出现问题。0),当我用版本" glew 1.6.0"替换glew32.lib时,解决了此问题。但是,当我在.cpp文件中编译附加的简单代码时,链接步骤失败了错误:外部符号_ imp _glewinit@0。然后,我使用vs2008的dollsin.exe来检查glew32.lib在glew 1.6.0和glew 1.10.0中,事实证明,glew 1.6.0具有一个名为_glewinit的符号,而glew 1.10.0却_glewinit _glewinit@glewinit@0。

。 。

所以我的问题是为什么这两个glew32.libs具有不同的符号名称?如果我想在GLEW 1.10.0中使用新功能,并且具有"未解决的外部符号_ imp _gleWinit",则解决该功能的最佳方法是什么?

 #include "glew.h"
 #include <GL/freeglut.h>
 int main(int argc, char **argv){
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("123");
    GLenum err = glewInit();
    return 0;
 }

ps:我的所有测试均在Win7上,编译器为VS2008_SP1。

@0是传递 0 bytes值的__stdcall函数的名称装饰方案(换句话说,void函数)。使用与您的库一起运送的适当标头,以便使用库已编译的调用惯例。在这种情况下,无论您是使用C还是C 链接(如注释中建议)都没有区别,因为__stdcall调用约定始终在符号名称的开头添加下划线。

关于_imp_glewInit,这完全是另一回事,因为那是DLL导入存根。最后,使用DLL版本的Glew几乎没有真正的好处。因此,我建议您使用静态链接版本:glew32s.lib并定义GLEW_STATIC,以使事情变得更容易。

要回答您的最后一个问题:GLEW中没有新功能可以通过放入新版本的DLL来使用,您的程序必须在您实际编写代码时就必须注意扩展名。如果没有利用新扩展之一的代码,那么将一无所获。这就是为什么GLEW的DLL版本没有提供特殊与静态库的原因。