5

这是新手要求。我正在寻找有关 .dll 创建的材料。具体来说,我想用一个简单的 3D 引擎创建一个 .dll,以了解该过程。我需要比维基百科页面更深入的动态链接库的信息,它们是如何创建的,有什么必要,如何为“调试”和“发布”创建不同的 .dll 文件,如何为其创建 PDB 文件以及如何创建一个头文件,以便轻松使用来自 a、fe、C++ 程序的库。具有强大理论方面的材料(不是那么多,“如何在 Visual Studio 中创建动态链接库”)会很棒。

请分享有关该主题的好材料,我只能在这里和那里找到一些信息,它并没有为我描绘图片。

4

2 回答 2

5

在字里行间阅读,我认为您真的想了解一般的库而不是具体的 dll。只是一个方便的对象(编译)代码包,以及一些关于如何调用它的信息。在 C++ 中,这通常采用 .h 文件的形式。

使用静态库(.lib),链接器以与处理所有其他类完全相同的方式提取所需的代码。一个普通的类将被编译为目标代码(MyClass.obj),当它们都完成后,链接器将它们全部粘在一起,并用适当的地址连接任何对象间调用。这与 .lib 库文件的过程相同。您最终会得到一大堆可执行代码,其中包括您的类和其中的库函数。

对于动态库(.dll),唯一的区别是链接(连接)发生在运行时而不是编译时,并且库对象代码保留在一个单独的球 - dll 文件中。编译 exe 时,所有使用库中函数的调用都映射到存根函数。当 Windows 为您加载 dll 时,它会将 dll 代码粘贴到与您的进程相同的内存区域中,并将存根函数连接到现在可用的实际函数。

唯一的其他区别是 dll 必须公开 Windows 在加载或卸载 dll 时可以调用的函数,以防 dll 想要进行任何初始设置/清除。这通常称为 DllMain()。

如果您想了解库,我会先专注于创建静态 .lib,然后再担心 dll。这是大部分工作的地方。一旦你有了一个库,把它变成一个 dll 就是小菜一碟。

创建库时需要考虑的主要问题是如何公开API(应用程序编程接口)。这就是您将向使用您的库的人公开的函数/类。您不必将它们全部公开,但您必须决定要公开什么。您是要公开一些 C 风格的函数,还是要公开整个对象?这是设计图书馆时的真正挑战。如果人们(和您!)会发现您的库有用,您应该尝试使您的 API 易于使用,并且尽可能明显。

As for pdb files, differently named release/debug modules, and creating .h files. These are identical to when doing so in an exe.

于 2012-07-11T12:25:28.777 回答
1

1) 使用 VS 向导创建一个新的 DLL 项目。

2)将您现有的源文件添加到其中。

3) 将要从 DLL 导出的函数的名称放入 *.def 文件(应由向导创建),如此处所述

基本上,就是这样。调试和发布配置由向导自动创建,但如果您希望 2 个变体以不同的方式命名,您可以更改它们的输出名称:转到项目属性 -> 配置属性 -> 常规 -> 目标名称。

于 2012-07-11T12:23:50.783 回答