我尝试下载 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();
}
提前致谢。
更新: 我找到的解决方案是,不仅使用我的库文件夹作为包含目录,而且还将该文件夹包含在我的项目本身中。
我知道这个问题很老了,但我想提供一些见解。我使用 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 脚本生成的
您还将在 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 }
};
您的项目将在没有这些文件的情况下构建。但是,如果没有它们,它们将不会在运行时加载。
希望这有帮助。