OpenGL期间链接器错误:SuperBible教程

时间:2010-11-08 10:39:09

标签: opengl linker-errors unresolved-external

我目前正试图通过编程一点DirectX 10和OpenGL 3.3来决定DirectX和OpenGL。我已经完成了DirectX的设置,链接和编译相当容易。 OpenGl是......更难。

OpenGL Superbible有一个名为Triangle.cpp的开始示例,其中我们链接了两个库freeglut_static.libGLTools.lib。这不是问题;我还去了项目目录,包括所有必要的OpenGL扩展的包含/和lib /路径(GLEE,Glew,Glut,FreeGlut,GLTools-damn,这还够吗?)。

首先我有几个链接器错误,因为我的代码生成是在DLL上设置的,而不是静态的。我已修复此问题,并将LIBC.lib添加到链接器中被忽略的库列表中(不确定是否将代码生成设置为静态修复此内容)。

现在我仍然有两个链接器错误,我无法摆脱:

1>Triangle.obj : error LNK2019: unresolved external symbol ___glutInitWithExit referenced in function _glutInit_ATEXIT_HACK
1>Triangle.obj : error LNK2019: unresolved external symbol ___glutCreateWindowWithExit referenced in function _glutCreateWindow_ATEXIT_HACK

我在google上搜索过这个问题,很多人评论了程序的静态性质(我已修复)以及Glut.h和Glut.lib之间存在冲突版本的特殊问题。但是,我甚至使用了旧版本的Glut(3.6),链接器错误仍然存​​在。

谷歌的其他搜索并没有真正提出任何合理的工作。所以,我在这里问:我该如何解决这个问题?

信息

代码生成:Multithreaded

C ++预处理程序命令:FREEGLUT_STATIC

IDE:Visual Studio 2008 and 2010. (Testing on both- same error on both)

忽略的库:LIBC.lib

Triangle.cpp代码(书中代码的简单复制/粘贴):

// Triangle.cpp
// Our first OpenGL program that will just draw a triangle on the screen.
#include <GLTools.h> // OpenGL toolkit
#include <GLShaderManager.h> // Shader Manager Class

//#define FREEGLUT_STATIC

#include <GL/glut.h> // Windows FreeGlut equivalent

GLBatch triangleBatch;
GLShaderManager shaderManager;
///////////////////////////////////////////////////////////////////////////////
// Window has changed size, or has just been created. In either case, we need
// to use the window dimensions to set the viewport and the projection matrix.
void ChangeSize(int w, int h)
{
    glViewport(0, 0, w, h);
}
///////////////////////////////////////////////////////////////////////////////
// This function does any needed initialization on the rendering context.
// This is the first opportunity to do any OpenGL related tasks.
void SetupRC()
{
    // Blue background
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f );
    shaderManager.InitializeStockShaders();
    // Load up a triangle
    GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
        0.5f, 0.0f, 0.0f,
        0.0f, 0.5f, 0.0f };
    triangleBatch.Begin(GL_TRIANGLES, 3);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
}
///////////////////////////////////////////////////////////////////////////////
// Called to draw scene
void RenderScene(void)
{
    // Clear the window with current clearing color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
    triangleBatch.Draw();
    // Perform the buffer swap to display the back buffer
    glutSwapBuffers();
}
///////////////////////////////////////////////////////////////////////////////
// Main entry point for GLUT based programs
int main(int argc, char* argv[])
{
    gltSetWorkingDirectory(argv[0]);
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Triangle");
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
        return 1;
    }
    SetupRC();
    glutMainLoop();
    return 0;
}

2 个答案:

答案 0 :(得分:4)

好的,这是答案:

我必须添加以下命令:

#pragma (lib, "freeglut_static.lib")
#pragma (lib, "gltools.lib")
在项目目录中放入所需文件的库路径后

。之后我还需要在我的Solution目录中包含glut32.dll(因为我还链接到Glut32),然后它就可以了。

希望这有助于某人!

答案 1 :(得分:3)

为了将来参考,您需要在链接器阶段提供要链接的库的名称。

在visual studio中,您可以在

下找到它
Project Properties->Linker->Input

添加它们';'在“附加依赖关系”字段中分隔。

我个人喜欢#pragma注释解决方案,因为您不需要记住在其他依赖项下添加.libs,只需要在某处使用#pragma语句。