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

Lip*_*ang 2 c++ opengl compiler-errors .lib

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

PS:我所有的测试都是在Win7上,编译器是VS2008_SP1。

And*_*man 5

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

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

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