当我在程序中使用 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和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;
}
PS:我的测试都是在Win7上进行的,编译器是VS2008_SP1。
最佳答案
@0
是 __stdcall
的名称修饰方案传递 0 字节参数的函数(换句话说,一个 void
函数)。使用库附带的正确 header ,以便它使用编译库时使用的调用约定。在这种情况下,无论您使用 C 还是 C++ 链接(如注释中建议的那样)都没有区别,因为 __stdcall
调用约定总是在符号名称的开头添加下划线。
关于_imp_glewInit
这完全是另一回事,因为那是 DLL 导入 stub 。最后,使用 DLL 版本的 GLEW 几乎没有任何实际好处。所以我建议你使用静态链接版本:glew32s.lib
并定义GLEW_STATIC
从长远来看,让事情变得更容易。
为了回答你的最后一个问题:GLEW 中没有任何新功能可以通过放入新版本的 DLL 来使用,你的程序必须知道当你实际编写代码时 GLEW 加载的扩展。如果没有代码利用新扩展之一,那么就一无所获。这就是为什么 GLEW 的 DLL 版本与静态库相比没有什么特别之处。
关于c++ - 未解析的外部符号 __imp__glewInit VS __imp__glewInit@0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22213558/