-1

我正在学习 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();
}
4

3 回答 3

6

你错过了那个LoadShaders()东西的lib(或cpp)文件,除非它只是标题。在不知道它的内容的情况下,我们不能肯定地说。


更新:

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

您应该执行以下操作:

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

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

于 2013-06-02T18:50:57.313 回答
1

问题在于您的LoadShaders函数没有主体(可能来自您的 LoadShaders.h)。找到 .cppLoadShaders或链接它的库。

如果 LoadShaders有一个库,由于您使用的是 VS 2012,您可以使用预处理器指令来链接您的库:

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

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

于 2013-06-02T18:54:28.800 回答
0

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

于 2013-06-02T18:58:24.043 回答