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ファイルを含むリンカーオプションを明示的に調整したり、これらのエラーに関連するフォーラムを読み取るインクルードパスを指定したりするなど、すべてを試しましたが、どれも役に立ちませんでした。この問題を解決する方法を教えてください。
Glewバイナリを http://glew.sourceforge.net/index.html ( https://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")
のような行が含まれています。
<3rdPartyDir>\bin
_から_<MyExePath>\
_にコピーします私も同じ問題を抱えていました。最後に役立つ手順が見つかりました このVisual StudioとOpenGLチュートリアルで 。この問題は、正しい構成(Win32またはx64)の.dllファイルが正しく含まれていました。
Glew.libを正しく使用しなかったようです。 config win32を使用してビルドする場合は、glew.lib(win32)またはその逆を使用する必要があります。プロジェクトのglew.libを置き換えることで試すことができます。
これは間違いなくリンカー設定の問題であり、特にglew
ライブラリの問題です。以前の修正の試みがうまくいかなかった理由は、私にはあまり明確ではありません。
glew
がコンパイルするために提供するチュートリアルプログラムを入手できますか?
あなたのコメントから、あなたはあなたのlibファイルを含む問題を抱えているようです。
-それがあなたが思っている場所にあるかどうかを確認できますか(正しくインストールされていますか)?
-VisualStudioはそれがどこにあるべきかを知っていますか(libへの正しいパスが提供されていますか)?
VisualStudioのProject ->Right click + properties -> Configuration Properties -> Linker -> General -> Additional Linker directories
には、glew32.lib
を含むフォルダーへのパスがありますか?