设置 OpenGL 红皮书项目时遇到问题

问题描述 投票:0回答:1

我尝试下载 OpenGL 编程指南:使用 SPIR-V 学习 OpenGL 的官方指南,版本 4.5 的示例,并尝试导入该库并将文件包含到我的 Visual Studio 解决方案中,以便我可以使用以下命令创建 OpenGL 应用程序作者使用的相同文件,但我不断收到这些错误:

LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
GLProgram.obj : error LNK2019: unresolved external symbol gl3wInit referenced in function main
GLProgram.obj : error LNK2019: unresolved external symbol LoadShaders referenced in function "void __cdecl init(void)" (?init@@YAXXZ)
GLProgram.obj : error LNK2001: unresolved external symbol gl3wDrawArrays
GLProgram.obj : error LNK2001: unresolved external symbol gl3wBindBuffer
GLProgram.obj : error LNK2001: unresolved external symbol gl3wEnableVertexAttribArray
GLProgram.obj : error LNK2001: unresolved external symbol gl3wUseProgram
GLProgram.obj : error LNK2001: unresolved external symbol gl3wVertexAttribPointer
GLProgram.obj : error LNK2001: unresolved external symbol gl3wClearBufferfv
GLProgram.obj : error LNK2001: unresolved external symbol gl3wBindVertexArray
GLProgram.obj : error LNK2001: unresolved external symbol gl3wGenVertexArrays
GLProgram.obj : error LNK2001: unresolved external symbol gl3wBufferStorage
GLProgram.obj : error LNK2001: unresolved external symbol gl3wCreateBuffers
C:\Users\saada\Desktop\Visual Studio Projects\OpenGL Programming Guide\OpenGL\OpenGL SPIR-V\x64\Debug\OpenGL SPIR-V.exe : fatal error LNK1120: 12 unresolved externals

我所做的是将示例下载中的 include 和 lib 文件夹设置为我的项目的包含目录,然后下载 glfw3.lib 文件并链接它,但似乎我缺少 gl3w 的某些内容。如何修复,我是否缺少一些 .lib 文件?这是我的代码,以防万一您需要它:

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

#define BUFFER_OFFSET(a) ((void*)(a))

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.90f, -0.90f }, {  0.85f, -0.90f }, { -0.90f,  0.85f },  // Triangle 1
        {  0.90f, -0.85f }, {  0.90f,  0.90f }, { -0.85f,  0.90f }   // Triangle 2
    };

    glCreateBuffers(NumBuffers, Buffers);
    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
    glBufferStorage(GL_ARRAY_BUFFER, sizeof(vertices), vertices, 0);

    ShaderInfo  shaders[] =
    {
        { GL_VERTEX_SHADER, "media/shaders/triangles/triangles.vert" },
        { GL_FRAGMENT_SHADER, "media/shaders/triangles/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)
{
    static const float black[] = { 0.0f, 0.0f, 0.0f, 0.0f };

    glClearBufferfv(GL_COLOR, 0, black);

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

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

int main(int argc, char** argv)
{
    glfwInit();

    GLFWwindow* window = glfwCreateWindow(800, 600, "Triangles", NULL, NULL);

    glfwMakeContextCurrent(window);
    gl3wInit();

    init();

    while (!glfwWindowShouldClose(window))
    {
        display();
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwDestroyWindow(window);

    glfwTerminate();
}

提前致谢。

更新: 我找到的解决方案是,不仅使用我的库文件夹作为包含目录,而且还将该文件夹包含在我的项目本身中。

c++ opengl-4
1个回答
0
投票

我知道这个问题很老了,但我想提供一些见解。我使用 Windows 11 和 NVidia 4070ti 显卡开发我的软件。

我在红皮书(带有 SPIR-V 的 4.5 版)中读到示例使用 gl3w 和 glfw。所以,我做的第一个想法就是获取这些库。

两者都带有 CMakeLists.txt。人们可能会认为 cmake 是用来构建库的。这仅适用于 glfw。

对于 gl3w,有一个名为 gl3w_gen.py 的 Python 脚本。运行该脚本以生成以下文件:

gl3w.c GL\gl3.h GL\glcorearb.h KHR\khrplatform.h

我将 gl3w.c 放入我的项目中,并指定了标头的包含目录的路径。

cmake -G“Visual Studio 16 2019”..

我实际上使用 Visual Studio 2022。所以,我的命令是:

cmake -G“Visual Studio 17 2022”..

截至今天(2024年10月2日)我发现cmake将glfw3.lib和glfw3.pdb放在build\src\Debug中(为什么在源目录中,我不知道。对我来说没有意义)。

包含文件 (glfw.h) 将位于 glfw-3.4\include\GLFW 中。它不会在构建目录中。

现在,在红皮书示例中,事情有点过时了。三角形示例的源文件 (01-triangles.cpp) 包括 vgl.h 和 LoadShaders.h

LoadShaders.h 中有以下行:

#包括

您需要将其更改为使用 gl3w python 脚本生成的。切勿在同一个项目中使用 glcorearb.h 和 gl.h。

您还将在 vgl.h 中找到以下内容:

#包括 #包括

将其更改为:

#包括 #包括

gl3w python 脚本将标头放置在 GL 目录而不是 GL3 目录中。

要将其放在一起,请执行以下操作:

对于 Visual Studio:

创建一个命令行项目。您将拥有一个 main 函数,而不是 WinMain。打开包含 main.cpp 的文件。将所有内容替换为红皮书中 01-triangles.cpp 中的内容。

将 gl3w.c 和 LoadShaders.cpp 添加到您的项目中。 将 LoadShaders.h 和 vgl.h 添加到您的项目中

在 LoadShaders.cpp 中,确保包含 #include 而不是

在 vgl.h 中确保包含以下内容:

#包括 #包括

不包括

交叉手指并单击“构建解决方案”。

它应该构建。

哦,还有一件事......

在主源文件的 init 函数中,您将找到以下内容:

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

获取三角形.vert 和三角形.frag。我将它们放在我的项目目录中(不是解决方案目录。使用项目目录)并将此代码更改为以下内容:

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

您的项目将在没有这些文件的情况下构建。但是,如果没有它们,它们将不会在运行时加载。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.