未解析的外部符号__imp__glewInit VS __imp__glewInit @ 0

时间:2014-03-06 02:19:07

标签: c++ opengl compiler-errors .lib

当我在我的程序中使用opengl时,在使用“glew”时遇到问题:未解析的外部符号_ imp _glewInit(当使用glew 1.10.0时),因为我替换了glew32.lib版本为“glew 1.6.0”,此问题已解决。但是,当我在.cpp文件中编译附加的简单代码时,链接步骤失败并出现错误:外部符号_ imp _glewInit @ 0。然后我使用VS2008的dumpin.exe来检查glew 1.6.0中的glew32.lib和glew 1.10.0,结果发现glew 1.6.0有一个名为_glewInit的符号,而glew 1.10.0有_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。

1 个答案:

答案 0 :(得分:3)

@0__stdcall函数的名称修饰方案,它传递 0 个字节的参数(换句话说,void函数)。使用库附带的适当标头,以便它使用编译库的调用约定。在这种情况下,无论您使用C语言还是C ++链接(如注释中所示)都没有区别,因为__stdcall调用约定总是在符号名称的开头添加下划线。

关于_imp_glewInit完全是另一回事,因为那是DLL导入存根。最后,使用GLEW的DLL版本几乎没有任何实际好处。因此,我建议您使用静态链接版本:glew32s.lib并定义GLEW_STATIC,以便在长期内更轻松。

回答你的最后一个问题:GLEW中没有新功能可以通过删除新版本的DLL来使用,你的程序必须知道实际编写代码时GLEW加载的扩展。如果没有利用其中一个新扩展的代码,则无法获得任何内容。这就是为什么GLEW的DLL版本与静态库没有什么特别之处。