错误LNK2019:函数“void __cdecl init(void)”中引用的未解析的外部符号_LoadShaders(?init @@ YAXXZ)

时间:2013-06-02 18:46:30

标签: opengl visual-studio-2012

我正在学习OpenGL并尝试运行我的第一个程序。我已将所有文件包含在include,lib和bin文件夹中。我试图添加opengl32.lib; glut32.lib; glu32.lib;在配置属性中 - >链接器 - >输入,但它也没有用。

我正在使用Visual Studio 2012。

///////////////////////////////////////////////////////////////////////
//
// triangles.cpp
//
///////////////////////////////////////////////////////////////////////

#include <iostream>
using namespace std;

#include <vgl.h>
#include <LoadShaders.h>

enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };

GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];

const GLuint NumVertices = 6;

//---------------------------------------------------------------------
//
// init
//

void
init(void)
{
    glGenVertexArrays(NumVAOs, VAOs);
    glBindVertexArray(VAOs[Triangles]);

    GLfloat vertices[NumVertices][2] = {
        { -0.90, -0.90 }, // Triangle 1
        { 0.85, -0.90 },
        { -0.90, 0.85 },
        { 0.90, -0.85 }, // Triangle 2
        { 0.90, 0.90 },
        { -0.85, 0.90 }
    };

    glGenBuffers(NumBuffers, Buffers);
    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
                vertices, GL_STATIC_DRAW);

    ShaderInfo shaders[] = {
        { GL_VERTEX_SHADER, "triangles.vert" },
        { GL_FRAGMENT_SHADER, "triangles.frag" },
        { GL_NONE, NULL }
    };

    GLuint program = LoadShaders(shaders);
    glUseProgram(program);

    glVertexAttribPointer(vPosition, 2, GL_FLOAT,
    GL_FALSE, 0, BUFFER_OFFSET(0));

    glEnableVertexAttribArray(vPosition);
}

//---------------------------------------------------------------------
//
// display
//

void
display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    glBindVertexArray(VAOs[Triangles]);
    glDrawArrays(GL_TRIANGLES, 0, NumVertices);

    glFlush();
}

//---------------------------------------------------------------------
//
// main
//

int
main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512, 512);
    glutInitContextVersion(4, 3);
    glutInitContextProfile(GLUT_CORE_PROFILE);
    glutCreateWindow(argv[0]);

    if (glewInit()) {
        cerr << "Unable to initialize GLEW ... exiting" << endl;
        exit(EXIT_FAILURE);
    }

    init();

    glutDisplayFunc(display);

    glutMainLoop();
}

3 个答案:

答案 0 :(得分:6)

你错过了LoadShaders()事件的lib(或cpp)文件,除非它只是标题。在不知道其内容的情况下,我们无法确定这一点。


更新

包含本书源代码的zip文件包含您需要的所有内容。

您应该执行以下操作:

  • 将zip文件解压缩到易于记忆的位置,例如“C:\ openglbook”。
  • 在Visual Studio 2012中打开或创建项目。
  • 打开菜单“PROJECT”并选择“[您的项目]属性...”(或点击 Alt + F7 )。
  • 对每个配置重复以下步骤,或选择左上角的“所有配置”。
  • 在左侧的树中打开“配置属性”,然后选择“VC ++目录”。
  • c:\openglbook\include添加到“包含目录”。
  • c:\openglbook\lib添加到“图书馆目录”。
  • 关闭项目属性。
  • 将文件“c:\ openglbook \ lib \ LoadShaders.cpp”复制到项目文件中,并将其添加为另一个源文件。

完成此项后,您的项目应该构建完成。如果您仍然缺少依赖项,例如GLUT函数,请将“lib”子目录中的适当库添加到您已知的链接库列表中。

答案 1 :(得分:1)

问题来自您的LoadShaders函数没有正文(可能来自您的LoadShaders.h)。找到LoadShaders的.cpp,或者链接它的lib。

如果LoadShaders 有一个 lib,因为你使用的是VS 2012,你可以使用预处理器指令链接你的lib:

#pragma comment( lib, "yourlibfilename.lib" )

确保您的lib实际上就在您所说的位置。默认情况下,Visual Studio将假定lib与源文件的默认文件夹位于同一文件夹中。

答案 2 :(得分:0)

仅添加Linker->Input中的库是不够的。链接器仍然无法找到它们,因为您的库位于某个任意目录中。将他们所在的目录添加到设置Linker->General->additional library directories