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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13339444/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 17:12:40  来源:igfitidea点击:

error LNK2019: unresolved external symbol

c++cvisual-studio-2010openglcompiler-errors

提问by BulBul

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

当我想编译我的 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  

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 every thing from tweaking linker option including .lib files explicitly, specifying include paths reading forums related to these errors and so on, none of them helped, can you guys help me how i fix this problem?

我尝试了从调整链接器选项(包括 .lib 文件)到与这些错误相关的阅读论坛的包含路径等等的所有操作,但没有任何帮助,你们能帮我解决这个问题吗?

采纳答案by pogorskiy

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)

我从http://glew.sourceforge.net/index.html( https://sourceforge.net/projects/glew/files/glew/1.9.0/glew-1.9.0-win32.zip/下载),并freeglut 2.8.0 MSVC套餐http://www.transmissionzero.co.uk/software/freeglut-devel/http://files.transmissionzero.co.uk/software/development/GLUT/freeglut-MSVC .zip)

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

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

I corrected the header of your file as

我更正了你的文件的标题

#include <Windows.h>
#include <iostream>
#include <gl/glew.h>
#include <gl/GL.h>
#include <gl/freeglut.h>

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

Linking successful, and it worked.

链接成功,它奏效了。

UPD

UPD

When using third-party libraries, usually:

使用第三方库时,通常:

  • You must set the include path to <3rdPartyDir>\include, but not to <3rdPartyDir>\include\lib_name. Declare its inclusion in the source code should be:
  • 您必须将包含路径设置为<3rdPartyDir>\include,而不是<3rdPartyDir>\include\lib_name。声明它包含在源代码中应该是:

correct: #include <lib_name/header_name.h>

正确的: #include <lib_name/header_name.h>

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

错误:#include <header_name.h>,因为在库中可以是内部依赖,例如#include <lib_name/other_header_name.h>

  • Set the library path to <3rdPartyDir>\lib. Then, you must specify the required libraries, one of the following methods:
  • 将库路径设置为<3rdPartyDir>\lib. 然后,您必须指定所需的库,以下方法之一:

For MSVC, add

对于 MSVC,添加

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

Or, add the required libraries to the linker options.

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

Some libraries support auto-linking mechanism (for example, freeglut), that is, the header file contains a line like #pragma comment(lib, "lib1_name.lib")

一些库支持自动链接机制(例如,freeglut),即头文件包含这样一行 #pragma comment(lib, "lib1_name.lib")

  • Copy the required dlls from <3rdPartyDir>\binto <MyExePath>\
  • 将所需的 dll 从 复制<3rdPartyDir>\bin<MyExePath>\

回答by alaferg

I was having the same problem. Finally found useful instructions in this Visual Studio and OpenGL tutorial. The issue was correctly including the .dll files for the right configuration (Win32 or x64).

我遇到了同样的问题。终于在这个 Visual Studio 和 OpenGL 教程中找到了有用的说明。该问题正确地包含了正确配置(Win32 或 x64)的 .dll 文件。

回答by linh linh

It seems as you used not correct glew.lib. when using config win32 to build you must use glew.lib(win32) or opposite. You can try by replace glew.lib in your project.

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

回答by Karthik T

This is definitely a problem with linker settings, specifically to do with the glewlibrary. Why your previous attempts to fix it have not worked isnt too clear to me.

这绝对是链接器设置的问题,特别是与glew库有关。为什么你之前修复它的尝试没有奏效,我不太清楚。

Are you able to get any tutorial programs that glewprovides to compile?

你能得到任何glew提供编译的教程程序吗?



Edit

编辑

From your comment it looks like you are having issues including your lib file.
- Can you verify if it is where you think it is (is it installed correctly)?
- Does Visual studio know where it is supposed to be(is correct path to lib provided)?

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

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

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