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

标签 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和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/

相关文章:

c++ - 在 C++ 中修改现有函数的任何技术或技巧?

c++ - 从 lambda 返回 Eigen::Map

c++ - OpenGL 曲面 segmentation 回调未执行

c++ - 我怎样才能用osg api在osgearth上画一个三角形

c++ - 在 OpenGL 中。如何将纹理的一部分复制到另一个纹理

c++ - nv-pro示例编译失败,全局范围没有 “int_least8_t”

c++ - 将前缀和名称与名称列表匹配的算法

c++ - 在 pthread 中阻塞当前线程

perl - Perl脚本中的奇数子例程编译错误

c++ - VC6编译错误