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

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

似乎当我尝试构建我的项目时,由于来自SOIL2的一些未解析的外部符号,它无法构建。它不知道是什么叫:“__ imp_glTexParameteri”。我的项目中有glfw lib,但它似乎仍然认为我没有任何引用。我在我的项目中有gl调用但它似乎没有扩展到SOIL2 lib。我能做些什么吗?

需要更多信息吗?

我已经确认在x64空间中运行的lib是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 game-engine unresolved-external soil
1个回答
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 Package Manager作弊并安装nupengl,它将为您安装OpenGL和GLEW。

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

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

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