【问题标题】:Unresolved External Symbol on SOIL2 Files - requires opengl calls [duplicate]SOIL2 文件上未解析的外部符号 - 需要 opengl 调用 [重复]
【发布时间】:2026-01-26 03:30:01
【问题描述】:

似乎当我尝试构建我的项目时,由于来自 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

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

【问题讨论】:

  • 你必须链接opengl。 -lgl
  • 我真的很新。我在周围看到过这样的说法。我该怎么办?就像你在谈论向链接器添加一些东西?
  • 评论更新
  • 我还是不明白=P

标签: c++ opengl game-engine unresolved-external soil


【解决方案1】:

深呼吸 提前为这篇文章的篇幅道歉

来自关于 LNK2019 错误的文档:

有很多方法可以得到这个错误,但它们都涉及对链接器无法解析或找不到定义的函数或变量的引用。编译器可以识别何时未声明符号,但无法识别未定义符号,因为定义可能位于不同的源文件或库中。如果一个符号被引用但从未定义,链接器会产生一个未解决的外部符号错误。

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

所以这些错误告诉你的是 SOIL2.obj 依赖于 OpenGL 库。

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

由*和科技百科提供:

静态库

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

动态库或共享库

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

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

链接不是一个容易理解的概念,如果您刚刚开始,您可能想访问 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 的情况下做到这一点。祝你好运!

【讨论】:

  • 应该指出,OpenGL 与其说是一个(从某种意义上说是有一个特定 OpenGL),而是一个API 规范以及在 OpenGL 的情况下链接的对象是作为操作系统分发的一部分的 API 层。实际的 OpenGL 实现随图形驱动程序一起提供。
  • 感谢@datenwolf 正确
  • 感谢您的帖子!我更喜欢这个解释而不是简短的东西。我学的越多,我的生活就会越好!我现在正在工作,但是当我回到家并查看所有这些链接时,如果我让它工作,我会将其标记为答案。谢谢!
最近更新 更多