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.sourceforge.net 下载了最新的 GLEW 64 位二进制文​​件,并将它们复制到 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 编译器可以给你链接错误的原因有很多。一是,不与您需要的库链接!有一个链接器选项 (/VERBOSE) 列出了它在尝试链接时正在搜索的所有链接库。打开它并确保它实际上正在搜索您拥有它们的 GLEW 库。

另一种可能性是您使用了错误的 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 回答
-1

我最近才遇到这个问题。我正在运行 Windows 8,使用 VS Express 2012 编译 GLEW 程序(我是这个 IDE 的新手,因为我已经使用 VC++ 6.0 这么久了)。通常这个问题是由于缺少 DLL 文件,我通过将 glew32.dll 从<Glew_HOME>\bin\Release\Win32(不是 x64 版本)复制到目录来解决它C:\Windows\SysWOW64。最好知道如何将 DLL 资源与 EXE 静态链接,这样我就不再需要依赖系统资源了。

于 2013-12-09T10:29:21.577 回答