gpt4 book ai didi

c - 为什么我必须只为某些库向编译器提供我正在使用的 *.lib 文件?

转载 作者:太空宇宙 更新时间:2023-11-04 07:46:32 25 4
gpt4 key购买 nike

我一直在按照一些教程使用一些 C 库在 Windows 上进行游戏开发。当使用一些 opengl 库(freeglut、glew)时,我只需要使用“cl file.c”进行编译,如果我在当前目录中有正确的 dll 文件,它将正常编译和运行。

但对于 SDL,我必须明确提供 lib 文件,例如“cl sdlprog.c SDL2.lib SDL2main.lib”。我还必须指出它是一个带有“/link/subsystem:console”的控制台程序。

为什么我需要为 SDL 做这些事情? opengl 程序编译良好,无需提及任何 lib 文件。

我确保所有的 lib 文件都在正确的位置。它们与我放置 opengl lib 文件的位置相同。

最佳答案

一些库是通过函数指针动态加载和访问的。在这些情况下,库不必在编译时显式链接。其他库可以静态链接,它们不需要动态加载,但链接是在编译时完成的。还有一些链接编译时的库,但它们只是为动态加载过程提供了一个易于使用的接口(interface)。一个很好的例子是 Win32 PE 文件中的导入地址表。例如,在 ntdll 库中可以找到对 NtTerminateProcess 的调用。您可以通过调用 LoadLibrary 和 GetProcAddress 动态调用 NtTerminateProcess,或者您可以选择在编译时链接它,这将为您创建接口(interface);但是,ntdll 仍然需要在运行时动态加载。链接它的编译时间不是静态的,它只是允许您在不使用 LoadLibrary/GetProcAddress 的情况下调用 NtTerminateProcess。

所以问题归结为静态链接之间的区别,而这正是 opengl 所做的。或者 sdl 需要的动态链接。正如我之前提到的动态加载,它在运行时为要加载的模块分配内存并将其加载到操作系统指定的地址中。已经有一篇文章略微涵盖了这一点:

Difference between static linking and dynamic linking

difference between dynamic loading and dynamic linking?

使用静态链接,如果您的库发生变化,您将需要重新编译二进制文件。在动态链接的情况下,您不必只重新编译二进制文件 dll。

关于c - 为什么我必须只为某些库向编译器提供我正在使用的 *.lib 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56519328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com