【问题标题】:Creating a .dll out of existing code从现有代码中创建 .dll
【发布时间】:2012-07-11 20:39:56
【问题描述】:

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

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

【问题讨论】:

  • 不幸的是,这个问题对于这个网站来说太宽泛了。希望有人可以为您提供教程。
  • 这是在 Windows 还是其他操作系统上?如果您在谈论 DLL,这听起来像 Windows,但最好确定不同操作系统之间存在差异,因此您可能希望这样标记您的问题
  • 如果你不能买一本关于这个主题的好书,那么 MSDN 是最好的资源 - 请参阅“关于动态链接库”(msdn.microsoft.com/en-us/library/ms681914(v=VS.85).aspx) 和这里“创建可重用代码 (C++) " (msdn.microsoft.com/en-us/library/bb384835)

标签: c++ dll


【解决方案1】:

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

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

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

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

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

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

对于 pdb 文件,不同命名的发布/调试模块,以及创建 .h 文件。这些与在 exe 中执行此操作时相同。

【讨论】:

  • 非常感谢,这正是我想要的。
  • DLL和PDB的关系可以看这个网址(codeproject.com/Articles/37456/…)
  • 请注意,您不能使用 DLL 导出某些内容。例如模板化的对象、具有内联成员的结构,甚至是一般的类——尽管有一些笨拙的解决方法。这就是 COM 被发明的原因。重点是,除非你真的能证明你将要介绍的所有令人头疼的问题,否则不要制作 DLL。
【解决方案2】:

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

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

3) 将要从 DLL 导出的函数的名称放入 *.def 文件(应该由向导创建)中,如 described here

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2019-02-08
    • 2017-05-16
    相关资源
    最近更新 更多