web-dev-qa-db-ja.com

エラー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 <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;
}

.libファイルを含むリンカーオプションを明示的に調整したり、これらのエラーに関連するフォーラムを読み取るインクルードパスを指定したりするなど、すべてを試しましたが、どれも役に立ちませんでした。この問題を解決する方法を教えてください。

8
BulBul

Glewバイナリを http://glew.sourceforge.net/index.htmlhttps://sourceforge.net/projects/glew/files/glew/1.9.0)から取得しました/glew-1.9.0-win32.Zip/download )およびfreeglut2.8.0 MSVCパッケージ http://www.transmissionzero.co.uk/software/freeglut-devel/http://files.transmissionzero.co.uk/software/development/GLUT/freeglut-MSVC.Zip

インクルードパスを_glew-1.9.0\include\_、_freeglut\include\_に設定し、ライブラリパスを_freeglut\lib\_、_glew-1.9.0\lib\_に設定しました。

ファイルのヘッダーを次のように修正しました

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

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

リンクは成功し、うまくいきました。

[〜#〜] upd [〜#〜]

サードパーティのライブラリを使用する場合、通常は次のようになります。

  • インクルードパスは_<3rdPartyDir>\include_に設定する必要がありますが、_<3rdPartyDir>\include\lib_name_には設定しないでください。ソースコードに含めることを宣言します。

正解:_#include <lib_name/header_name.h>_

間違った例:_#include <header_name.h>_、ライブラリ内に内部依存関係がある可能性があるため、たとえば_#include <lib_name/other_header_name.h>_

  • ライブラリパスを_<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_から_<MyExePath>\_にコピーします
6
pogorskiy

私も同じ問題を抱えていました。最後に役立つ手順が見つかりました このVisual StudioとOpenGLチュートリアルで 。この問題は、正しい構成(Win32またはx64)の.dllファイルが正しく含まれていました。

3
alaferg

Glew.libを正しく使用しなかったようです。 config win32を使用してビルドする場合は、glew.lib(win32)またはその逆を使用する必要があります。プロジェクトのglew.libを置き換えることで試すことができます。

1
linh linh

これは間違いなくリンカー設定の問題であり、特にglewライブラリの問題です。以前の修正の試みがうまくいかなかった理由は、私にはあまり明確ではありません。

glewがコンパイルするために提供するチュートリアルプログラムを入手できますか?


編集

あなたのコメントから、あなたはあなたのlibファイルを含む問題を抱えているようです。
-それがあなたが思っている場所にあるかどうかを確認できますか(正しくインストールされていますか)?
-VisualStudioはそれがどこにあるべきかを知っていますか(libへの正しいパスが提供されていますか)?

VisualStudioのProject ->Right click + properties -> Configuration Properties -> Linker -> General -> Additional Linker directoriesには、glew32.libを含むフォルダーへのパスがありますか?

1
Karthik T