Error LNK2019: unresolved external character

while I want to compile my opengl code, I get the following errors:

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 

my code is:

 #include <Windows.h> #include <iostream> #include <glew.h> #include <gl\GL.h> #include <freeglut.h> 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; } 

I tried everything I needed, from setting the linker, including .lib files, explicitly indicating to include paths that read forums related to these errors, and so on, none of them helped, can you guys help me how can i fix this problem?

+8
c ++ c visual-studio-2010 compiler-errors opengl
source share
4 answers

I got the glew binaries from http://glew.sourceforge.net/index.html ( https://sourceforge.net/projects/glew/files/glew/1.9.0/glew-1.9.0-win32.zip/ download ) and freeglut 2.8.0 MSVC Package from http://www.transmissionzero.co.uk/software/freeglut-devel/ ( http://files.transmissionzero.co.uk/software/development/GLUT/freeglut-MSVC .zip )

I set the inclusion path to glew-1.9.0\include\ , freeglut\include\ and the library path to freeglut\lib\ , glew-1.9.0\lib\ .

I fixed your file header as

 #include <Windows.h> #include <iostream> #include <gl/glew.h> #include <gl/GL.h> #include <gl/freeglut.h> #pragma comment(lib, "glew32.lib") 

The binding was successful and it worked.

UPD

When using third-party libraries, usually:

  • You must specify the inclusion path to <3rdPartyDir>\include , but not to <3rdPartyDir>\include\lib_name . Announce inclusion in source code:

correct: #include <lib_name/header_name.h>

wrong: #include <header_name.h> , because inside the library there may be internal dependencies, for example #include <lib_name/other_header_name.h>

  • Set the library path to <3rdPartyDir>\lib . Then you must specify the required libraries, in one of the following ways:

For MSVC add

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

Or add the necessary libraries to the linker options.

Some libraries support an automatic binding mechanism (for example, freeglut), that is, the header file contains a line of the type #pragma comment(lib, "lib1_name.lib")

  • Copy the required <3rdPartyDir>\bin from <3rdPartyDir>\bin to <MyExePath>\
+6
source share

I had the same problem. Finally, I found helpful instructions in this Visual Studio and OpenGL tutorial . The problem was correct, including the DLL files for the correct configuration (Win32 or x64).

+3
source share

This is definitely a problem with the linker settings, in particular with the glew library. Why your previous attempts to fix this did not work are not too clear to me.

Can you get any tutorials that glew provides for compilation?


Edit

From your comment, it looks like you have problems including your lib file.
- Can you check if it is where you think it is (is it installed correctly)?
- Does the visual studio know where it should be (the correct path to the provided lib)?

Does Project ->Right click + properties -> Configuration Properties -> Linker -> General -> Additional Linker directories in Visual Studio have the path to the folder containing glew32.lib ?

+1
source share

It seems you used the wrong glew.lib. when using win32 config to build you must use glew.lib (win32) or vice versa. You can try replacing glew.lib in your project.

+1
source share

All Articles