当我在我的程序中使用opengl时,当我使用“glew”时遇到了一个问题:未解决的外部符号_imp_glewInit (当我使用glew 1.10.0),当我用"glew 1.6.0“代替glw32.lib时,这个问题就解决了。但是,当我在.cpp文件中编译附加的简单代码时,链接步骤出现错误:外部符号_imp_glewInit@0。然后使用in 2008的dumpin.exe检查GleW1.6.0和GleW1.10.0中的glew32.lib,结果显示Glew1.6.0有一个名为_glewInit的符号,而GleW1.10.0有_glewInit@0。
所以,我的问题是,为什么这两个glew32.libs有不同的符号名称?如果我想使用GLEW1.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。
发布于 2014-03-06 22:55:41
@0是__stdcall函数的名称修饰方案,它传递值为字节的参数(换句话说,是void函数)。使用随库附带的正确的标头,以便它使用编译库时的调用约定。在这种情况下,无论您使用C还是C++链接(如注释中所建议的那样),都没有什么区别,因为__stdcall调用约定总是在符号名称的开头添加下划线。
对于_imp_glewInit,这完全是另一回事,因为这是DLL导入存根。最后,使用GLEW的DLL版本几乎没有真正的好处。因此,我建议您使用静态链接版本:glew32s.lib和定义GLEW_STATIC来使长期操作更容易。
要回答您的最后一个问题: GLEW中没有新的特性,您只需加入一个新版本的DLL即可使用,您的程序在编写代码时必须注意GLEW加载的扩展。如果没有利用其中一个新扩展的代码,那么什么都不会得到。这就是为什么GLEW的DLL版本与静态库相比没有什么特别之处。
https://stackoverflow.com/questions/22213558
复制相似问题