1

openGLbook.com チュートリアルを実行しようとしています。次の一般的なエラーが発生します。

    1>------ Build started: Project: OpenGL Startup, Configuration: Debug Win32 ------
1>Build started 1/25/2013 8:18:16 PM.
1>InitializeBuildStatus:
1>  Touching "Debug\OpenGL Startup.unsuccessfulbuild".
1>ClCompile:
1>  All outputs are up-to-date.
1>ManifestResourceCompile:
1>  All outputs are up-to-date.
1>main.obj : error LNK2019: unresolved external symbol __imp__glewGetErrorString@4 referenced in function _Initialize
1>main.obj : error LNK2019: unresolved external symbol __imp__glewInit@0 referenced in function _Initialize
1>J:\Coding Projects\OpenGL 3.3 Tutorial\OpenGL Startup\Debug\OpenGL Startup.exe : fatal error LNK1120: 2 unresolved externals
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.07
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

GLEW の最新の 64 ビット バイナリを glew.sourceforge.net からダウンロードし、C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A 内の対応する場所にコピーしました。また、最新の freeglut ファイルをダウンロードして、同じことを行いました。

私は VS 2010 を使用しています。以下は、私が変更した設定です (他のスレッドやフォーラムに基づいています)。

1) プロパティ > VC++ ディレクトリ........ glew.h と freeglut.h を含む「include」フォルダを追加

2) プロパティ > リンカー > 入力 > 追加の依存関係..... glew32.lib、freeglut.lib、glew32mx.lib、glew32mxs.lib、glew32s.lib を追加

ライブラリを適切にリンクしていない理由が本当にわかりません。また、C ドライブとは別のドライブで作業していることにも注意してください。プロパティですべてを適切なフォルダーにリンクしているにもかかわらず、それは効果がありますか?

編集:実際のコードを投稿するのを忘れました。ここにあります:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
#define WINDOW_TITLE_PREFIX "Chapter 1"

int CurrentWidth = 800,
    CurrentHeight = 600,
    WindowHandle = 0;

    unsigned FrameCount = 0;

void Initialize(int, char*[]);
void InitWindow(int, char*[]);
void ResizeFunction(int, int);
void RenderFunction(void);
void TimerFunction(int);
void IdleFunction(void);

int main(int argc, char* argv[])
{
    Initialize(argc, argv);

    glutMainLoop();

    exit(EXIT_SUCCESS);
}

void Initialize(int argc, char* argv[])
{
    GLenum GlewInitResult;

    InitWindow(argc, argv);

    GlewInitResult = glewInit();

    if (GLEW_OK != GlewInitResult) {
        fprintf(
            stderr,
            "ERROR: %s\n",
            glewGetErrorString(GlewInitResult)
            );
    }

    fprintf(
        stdout,
        "INFO: OpenGL Version: %s\n",
        glGetString(GL_VERSION)
    );

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}

void InitWindow(int argc, char* argv[])
{
    glutInit(&argc, argv);

    glutInitContextVersion(4, 0);
    glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
    glutInitContextProfile(GLUT_CORE_PROFILE);

    glutSetOption(
        GLUT_ACTION_ON_WINDOW_CLOSE,
        GLUT_ACTION_GLUTMAINLOOP_RETURNS
    );

    glutInitWindowSize(CurrentWidth, CurrentHeight);

    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

    WindowHandle = glutCreateWindow(WINDOW_TITLE_PREFIX);

    if(WindowHandle < 1) {
        fprintf(
            stderr,
            "ERROR: Could not create a new rendering window.\n"
        );
        exit(EXIT_FAILURE);
    }

    glutReshapeFunc(ResizeFunction);
    glutDisplayFunc(RenderFunction);
    glutIdleFunc(IdleFunction);
    glutTimerFunc(0, TimerFunction, 0);
}

void ResizeFunction(int Width, int Height)
{
    CurrentWidth = Width;
    CurrentHeight = Height;
    glViewport(0, 0, CurrentWidth, CurrentHeight);
}

void RenderFunction(void)
{
    ++FrameCount;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSwapBuffers();
    glutPostRedisplay();
}


void IdleFunction(void)
{
    glutPostRedisplay();
}

void TimerFunction(int Value)
{
    if (0 != Value) {
        char* TempString = (char*)
            malloc(512 + strlen(WINDOW_TITLE_PREFIX));

        sprintf(
            TempString,
            "%s: %d Frames Per Second @ %d x %d",
            WINDOW_TITLE_PREFIX,
            FrameCount * 4,
            CurrentWidth,
            CurrentHeight
        );

        glutSetWindowTitle(TempString);
        free(TempString);
    }

    FrameCount = 0;
    glutTimerFunc(250, TimerFunction, 1);
}
4

3 に答える 3

11

あなたがすでにこれを理解していたら、申し訳ありません。また、コメントを読む時間もありませんでした。ただし、静的ライブラリである glew32s.lib にリンクしていますが、インクルードを含むコードの先頭に #define GLEW_STATIC がありません。

それを試してみてください。私はそれがあなたの問題だと確信しています。コードでその行をコメントアウトしようとしたところ、同様のエラーが発生しました。

于 2013-02-14T03:00:02.173 に答える
2

まあ、MSコンパイラは多くの理由であなたにリンクエラーを与えることができます。1つは、必要なライブラリとリンクしないことです。リンクしようとしたときに検索しているすべてのリンクライブラリを一覧表示するリンカーオプション(/ VERBOSE)があります。それをオンにして、実際にそれらがあるGLEWライブラリを検索していることを確認します。

もう1つの可能性は、間違ったGLEWライブラリを使用していることです。MSは、コンパイラのバージョン間で関数/メソッド名をエンコードする方法を意図的に変更しているため、VC++2008ライブラリをVC++2010コンパイル済みアプリにリンクすることはできません。同様に、64ビットライブラリを32ビットビルドにリンクすることはできません。このような「未解決の外部シンボル」エラーが発生します。

そこに表示されている「マングルされた」名前を「アンマングル」することができます:_ imp _glewGetErrorString @ 4

余分なアンダースコアなどに基づいて、64ビットライブラリか32ビットライブラリかを判断します。

http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling

しかし、それは初心者にとっては難しいことです。

私の推測では、あなたはあなたが思っているライブラリとリンクしていません。

于 2013-01-26T15:09:36.033 に答える