在字里行间阅读,我认为您真的想了解一般的库而不是具体的 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.