SOIL2 文件上未解析的外部符号 - 需要 opengl 调用 [duplicate]

Unresolved External Symbol on SOIL2 Files - requires opengl calls [duplicate]

提问人:Kingrune 提问时间:4/8/2019 更新时间:4/9/2019 访问量:827

问:

似乎当我尝试构建我的项目时,由于 SOIL2 的一些未解析的外部符号,它无法构建。它不知道“__imp_glTexParameteri”之类的称呼是什么。我的项目中有 glfw lib,但它似乎仍然认为我对此没有任何参考。我的项目中有 gl 调用,但它似乎没有扩展到 SOIL2 库。我能做些什么吗?

需要更多信息吗?

我已经确认在 x64 空间中运行的库是 x64,而 x32 库在 x32 空间中运行

1>SOIL2.obj : error LNK2019: unresolved external symbol __imp_wglGetProcAddress referenced in function SOIL_GL_GetProcAddress
1>SOIL2.obj : error LNK2019: unresolved external symbol __imp_glBindTexture referenced in function SOIL_direct_load_DDS_from_memory
1>SOIL2.obj : error LNK2019: unresolved external symbol __imp_glDeleteTextures referenced in function SOIL_direct_load_DDS_from_memory
1>SOIL2.obj : error LNK2019: unresolved external symbol __imp_glGenTextures referenced in function SOIL_direct_load_DDS_from_memory
1>SOIL2.obj : error LNK2019: unresolved external symbol __imp_glGetError referenced in function SOIL_direct_load_ETC1_from_memory
1>SOIL2.obj : error LNK2019: unresolved external symbol __imp_glGetIntegerv referenced in function SOIL_GL_ExtensionSupported
1>SOIL2.obj : error LNK2019: unresolved external symbol __imp_glGetString referenced in function SOIL_GL_ExtensionSupported
1>SOIL2.obj : error LNK2019: unresolved external symbol __imp_glPixelStorei referenced in function SOIL_direct_load_ETC1_from_memory
1>SOIL2.obj : error LNK2019: unresolved external symbol __imp_glReadPixels referenced in function SOIL_save_screenshot
1>SOIL2.obj : error LNK2019: unresolved external symbol __imp_glTexImage2D referenced in function SOIL_direct_load_DDS_from_memory
1>SOIL2.obj : error LNK2019: unresolved external symbol __imp_glTexParameteri referenced in function SOIL_direct_load_DDS_from_memory

这是我得到的未解析的外部符号。

C++ OpenGL 游戏引擎 未解析的外部 土壤

评论

1赞 xaxxon 4/8/2019
您必须链接 OpenGL。-lgl
0赞 Kingrune 4/8/2019
我真的是新来的。我看到有人这么说。我该怎么做?就像你在谈论向链接器添加一些东西一样?
0赞 xaxxon 4/8/2019
评论已更新
0赞 Kingrune 4/8/2019
我仍然不明白=P

答:

1赞 AdaRaider 4/8/2019 #1

深吸一口气提前为这篇文章的长度道歉

从有关LNK2019错误的文档中:

有很多方法可以获取此错误,但所有这些方法都涉及对链接器无法解析或找不到定义的函数或变量的引用。编译器可以识别符号何时未声明,但不能识别何时未定义符号,因为定义可能位于不同的源文件或库中。如果引用了某个符号,但从未定义过,则链接器将生成未解析的外部符号错误。

@xaxxon说的是对的。链接器生成警告的函数都是 OpenGL 函数。

因此,这些错误告诉您的是 SOIL2.obj 依赖于 OpenGL 库。

您可以链接两种常见的库形式:静态库和动态库。

由Wikipedia & Technopedia提供:

静态库

在计算机科学中,静态库或静态链接库是一组例程、外部函数和变量,它们在编译时在调用方中解析,并由编译器、链接器或绑定器复制到目标应用程序中,从而生成目标文件和独立的可执行文件。

动态库或共享库

动态库是一种编程概念,其中具有特殊功能的共享库仅在程序执行期间启动,从而最大限度地减少了整体程序大小,并有助于提高应用程序性能以减少内存消耗。在大多数软件程序中,将特定功能分发到不同的模块中允许根据需要加载。

动态库从来都不是可执行文件或应用程序的一部分。在运行时,在动态库和可执行文件或应用程序之间建立链接。

链接不是一个容易理解的概念,如果你刚刚开始,你可能想访问 Lazy Foo 的网站,它可以引导你了解链接到 freeglut 库的基础知识。

http://lazyfoo.net/tutorials/OpenGL/01_hello_opengl/windows/msvsnet2010u/index.php

但最基本的是;为了使用别人的库,您应该首先了解该库是如何创建的。此人是创建了静态库还是动态库。然后,您可以确定应该如何链接到该库。

例如,当链接到共享库时,您需要将 .dll 文件包含在可执行文件中,这是因为当程序运行时,“剩余”的链接位是“及时”完成的,以便程序运行。 请参见:https://www.lurklurk.org/linkers/linkers.html

我知道这个答案太长了,你可能只想要一个简单的:“将这个文件拖放到 x 目录中”。不幸的是,如果你坐下来确切地了解编译器和链接器等事情实际上在做什么,以及它们试图与你交流什么,它确实是值得的。

我不能给你一步一步的说明,因为这取决于你拥有什么库。

霍耶夫弗

如果你碰巧在 Visual Studio 中有一个项目,你可以使用 Nuget 包管理器作弊并安装 nupengl,这将为你安装 OpenGL 和 GLEW。

http://in2gpu.com/2014/11/29/setting-opengl-visual-studio-using-nuget/

请记住,这不是魔法!它只是链接到库,你应该真正学习如何在没有 Nuget 的情况下做到这一点。祝你好运!

评论

1赞 datenwolf 4/8/2019
应该指出的是,OpenGL 与其说是一个(从某种意义上说,有一个特定的 OpenGL),不如说是一个 API 规范,在 OpenGL 的情况下,你所链接的是一个 API 层,它是操作系统发行版的一部分。实际的 OpenGL 实现附带图形驱动程序。
0赞 AdaRaider 4/8/2019
谢谢@datenwolf正确
1赞 Kingrune 4/9/2019
谢谢你的帖子!我宁愿这种解释,也不愿简短。我学得越多,我就会越好!我现在在工作,但是当我回到家并查看所有这些链接时,如果我让它工作,我会将其标记为答案。谢谢!