我已经学习opengl大约4-5个月了。 我准备停止使用 glut(一个帮助器库,它混淆了 opengl 编程的许多困难/乏味的方面)
问题是,我觉得我已经删除了对 glut.h 的所有引用,以及 glut 中的所有函数调用,但是当我运行我的应用程序时,它仍然试图链接到 glut32.dll。
一般来说,这样我和其他人可以稍后学习, 在编译之前或之后,如何判断可执行文件/源代码需要哪些库以及为什么(函数/标头方面)?
我正在使用 VS2010,但在 Linux 机器上使用 g++ 交叉编译它 在这个特定的实例中,我没有将 dll 列为附加依赖项。但我确实在外部依赖项文件夹中看到了 glut.h...我只是无法删除它
Dependency Walker 是您检查已编译二进制文件的 dll 依赖关系的朋友。
主要问题当然是,您已将 glut.lib 或 glut32.lib 添加到项目中的某个位置。它可能在项目属性>链接器设置>附加库中,或者某些源文件包含类似这样的#pragma:-
#pragma comment(lib, "glut32.lib")
查看您项目的链接器属性。 dll,或者更确切地说,相应的 .lib 应列在“附加依赖项”下。
编辑:
顺便说一句,包含标头和链接库(或 dll)是两件不同的事情。 您可能在某处包含标头,但没有链接到相应的库。 在这种情况下,链接器会给你一个错误。 另一方面,您可能不包含标头,并且根本不使用该库,但您可能仍然链接到它。
在这种情况下,我们似乎两者都有。 如果 glut.h 位于外部依赖项文件夹中,那么您必须将其包含在代码中的某个位置。 尝试使用“在文件中查找”来查找它。 或者从系统中完全删除它并尝试编译。
每个 exe/dll 都有一个称为导入地址表 (IAT) 的东西,它是存储在 PE(可移植可执行文件:窗口的可执行文件格式)文件头中的信息,有关加载相关模块时加载程序需要加载哪些 dll。您可以使用 PE Viewer 或 PE Explorer 等工具来查看此信息或编写自己的信息(这比较困难)。您将看到静态链接到可执行文件的库。如果您在任何这些文件中都没有看到 glut32.dll,则它可能是通过其他 openGL 库中的 LoadLibrary api 动态加载的。我对 openGL 二进制文件不是很熟悉,所以我无法为您确认这一点。
如果您无法在 Visual Studio 项目选项中找到 glut.lib 的隐藏位置,请在标准文本编辑器中打开 .vcproj 并进行全文搜索。