错误LNK2019:未解析的外部符号

虽然我想编译我的opengl代码我得到以下错误:

Error 1 error LNK2019: unresolved external symbol __imp__glewInit@0 Error 2 error LNK2019: unresolved external symbol __imp__glewGetErrorString@4 Error 3 error LNK2001: unresolved external symbol __imp____glewAttachShader Error 4 error LNK2001: unresolved external symbol __imp____glewCompileShader Error 5 error LNK2001: unresolved external symbol __imp____glewCreateProgram Error 6 error LNK2001: unresolved external symbol __imp____glewCreateShader Error 7 error LNK2001: unresolved external symbol __imp____glewDeleteProgram Error 8 error LNK2001: unresolved external symbol __imp____glewDisableVertexAttribArray Error 9 error LNK2001: unresolved external symbol __imp____glewEnableVertexAttribArray Error 10 error LNK2001: unresolved external symbol __imp____glewGetAttribLocation Error 11 error LNK2001: unresolved external symbol __imp____glewGetProgramiv Error 12 error LNK2001: unresolved external symbol __imp____glewGetShaderiv Error 13 error LNK2001: unresolved external symbol __imp____glewLinkProgram Error 16 error LNK2001: unresolved external symbol __imp____glewVertexAttribPointer Error 17 error LNK1120: 16 unresolved externals 

我的代码是:

 #include  #include  #include  #include  #include  using namespace std; GLuint program; GLint attribute_coord2d; int init_resources(void) { GLint compile_ok = GL_FALSE, link_ok = GL_FALSE; GLuint vs = glCreateShader(GL_VERTEX_SHADER); const char *vs_source = #ifdef GL_ES_VERSION_2_0 "#version 100\n" // OpenGL ES 2.0 #else "#version 120\n" // OpenGL 2.1 #endif "attribute vec2 coord2d; " "void main(void) { " " gl_Position = vec4(coord2d, 0.0, 1.0); " "}"; glShaderSource(vs, 1, &vs_source, NULL); glCompileShader(vs); glGetShaderiv(vs, GL_COMPILE_STATUS, &compile_ok); if (0 == compile_ok) { fprintf(stderr, "Error in vertex shader\n"); return 0; } GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); const char *fs_source = "#version 120 \n" "void main(void) { " " gl_FragColor[0] = 0.0; " " gl_FragColor[1] = 0.0; " " gl_FragColor[2] = 1.0; " "}"; glShaderSource(fs, 1, &fs_source, NULL); glCompileShader(fs); glGetShaderiv(fs, GL_COMPILE_STATUS, &compile_ok); if (!compile_ok) { fprintf(stderr, "Error in fragment shader\n"); return 0; } program = glCreateProgram(); glAttachShader(program, vs); glAttachShader(program, fs); glLinkProgram(program); glGetProgramiv(program, GL_LINK_STATUS, &link_ok); if (!link_ok) { fprintf(stderr, "glLinkProgram:"); return 0; } const char* attribute_name = "coord2d"; attribute_coord2d = glGetAttribLocation(program, attribute_name); if (attribute_coord2d == -1) { fprintf(stderr, "Could not bind attribute %s\n", attribute_name); return 0; } return 1; } void onDisplay() { /* Clear the background as white */ glClearColor(1.0, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(program); glEnableVertexAttribArray(attribute_coord2d); GLfloat triangle_vertices[] = { 0.0, 0.8, -0.8, -0.8, 0.8, -0.8, }; /* Describe our vertices array to OpenGL (it can't guess its format automatically) */ glVertexAttribPointer( attribute_coord2d, // attribute 2, // number of elements per vertex, here (x,y) GL_FLOAT, // the type of each element GL_FALSE, // take our values as-is 0, // no extra data between each position triangle_vertices // pointer to the C array ); /* Push each element in buffer_vertices to the vertex shader */ glDrawArrays(GL_TRIANGLES, 0, 3); glDisableVertexAttribArray(attribute_coord2d); /* Display the result */ glutSwapBuffers(); } void free_resources() { glDeleteProgram(program); } int main(int argc, char* argv[]) { /* Glut-related initialising functions */ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH); glutInitWindowSize(640, 480); glutCreateWindow("My First Triangle"); /* Extension wrangler initialising */ GLenum glew_status = glewInit(); if (glew_status != GLEW_OK) { fprintf(stderr, "Error: %s\n", glewGetErrorString(glew_status)); return EXIT_FAILURE; } /* When all init functions runs without errors, the program can initialise the resources */ if (1 == init_resources()) { /* We can display it if everything goes OK */ glutDisplayFunc(onDisplay); glutMainLoop(); } /* If the program exits in the usual way, free resources and exit with a success */ free_resources(); return EXIT_SUCCESS; } 

我试图通过调整链接器选项明确地包括.lib文件,指定包含读取与这些错误相关的论坛的路径等等,没有一个帮助,你们能帮我解决这个问题吗?

我从http://glew.sourceforge.net/index.html获取了glew二进制文件( https://sourceforge.net/projects/glew/files/glew/1.9.0/glew-1.9.0-win32.zip/从http://www.transmissionzero.co.uk/software/freeglut-devel/(http://files.transmissionzero.co.uk/software/development/GLUT/freeglut-MSVC 下载 )和freeglut 2.8.0 MSVC软件包.zip )

我将包含路径设置为glew-1.9.0\include\freeglut\include\和库路径到freeglut\lib\glew-1.9.0\lib\

我将文件的标题更正为

 #include  #include  #include  #include  #include  #pragma comment(lib, "glew32.lib") 

链接成功,它的工作。

UPD

使用第三方库时,通常:

  • 您必须将包含路径设置为<3rdPartyDir>\include ,但不能设置为<3rdPartyDir>\include\lib_name 。 声明它包含在源代码中应该是:

更正: #include

错误: #include ,因为库内可以是内部依赖项,例如#include

  • 将库路径设置为<3rdPartyDir>\lib 。 然后,您必须指定所需的库,以下方法之一:

对于MSVC,请添加

 #ifdef _MSC_VER #pragma comment(lib, "lib1_name.lib") #pragma comment(lib, "lib2_name.lib") /// etc #endif 

或者,将所需的库添加到链接器选项。

有些库支持自动链接机制(例如,freeglut),也就是说,头文件包含一行像#pragma comment(lib, "lib1_name.lib")

  • 将所需的dll从<3rdPartyDir>\bin复制到\

我遇到了同样的问题。 终于找到了有用的说明。 问题是正确包含正确配置的.dll文件(Win32或x64)。

这绝对是链接器设置的问题,特别是与glew库有关。 为什么你之前尝试修复它的方法不起作用对我来说太清楚了。

你能获得glew提供的任何教程吗?


编辑

从您的评论看来,您遇到的问题包括您的lib文件。
– 您能否validation它是否在您认为的位置(是否正确安装)?
– Visual Studio是否知道它应该在哪里(提供lib的正确途径)?

Project ->Right click + properties -> Configuration Properties -> Linker -> General -> Additional Linker directories Visual Studio中的Project ->Right click + properties -> Configuration Properties -> Linker -> General -> Additional Linker directories是否包含包含glew32.lib的文件夹的路径?

看起来你用不正确的glew.lib。 使用config win32构建时,必须使用glew.lib(win32)或相反。 您可以尝试在项目中替换glew.lib。