-1

以下是链接 1 的摘录

Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,以允许编译器自动生成导出名称并将它们放在 .lib 文件中。然后可以像使用静态 .lib 一样使用此 .lib 文件与 DLL 链接。在较新的编译器版本中,您可以使用 __declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。__declspec(dllexport) 将导出指令添加到目标文件,因此您不需要使用 .def 文件。

我在一定程度上理解了上面的段落,但不是很好。

以下是链接2的摘录

构建 DLL 时,链接器使用 .def 文件来创建导出 (.exp) 文件和导入库 (.lib) 文件。然后链接器使用导出文件来构建 DLL 文件。隐式链接到 DLL 的可执行文件在构建时链接到导入库。

现在,这让我很困惑,让我问了以下问题:

  1. 谁能用简单的话告诉我出口这个词的 真正含义?我相信这使得一个对象可以从一段代码访问到另一段代码——但是,嘿!

  2. 在使用旧库构建项目时,我在大多数库中都看到了 .def 文件。但是最新的编译器会自动导出对象。将旧版本的 Visual Studio 项目转换为新版本时,.def 文件的存在会导致任何冲突吗?

  3. .dll生成后的.lib(所谓的导入文件)有什么用。可以安全删除吗?

  4. 啊啊啊!!静态库(.lib)和导入库(.lib)有什么区别?大错特错吧?但是还是!!

  5. 是windows特有的现象吗?我相信不是。所谓的导入文件的 Linux 对应物是什么?

如果问题还不清楚,请随时改写问题。

4

1 回答 1

2

告诉我出口这个词的真正含义是什么?

它只是意味着告诉链接器它需要将一个条目放入 DLL 的导出表中。操作系统加载器稍后使用它在运行时将不同模块中的代码粘合在一起。

我在大多数人中看到 .def 文件

可能是非常古老的项目。或者它只是从未作为一个旨在创建单独模块的项目开始。就像一个静态库,所以源代码没有__declspec属性。跨平台库很可能符合该要求。C 和 C++ 语言规范仍然没有办法以标准化的方式创建模块。每个人都这样做,没有人以同样的方式这样做。大量时间消耗。

.lib(所谓的导入文件)有什么用

在使用DLL的项目中是必需的。链接器需要知道标识符位于另一个建筑物中,并且无法在链接时解析。它将一个条目放在操作系统加载程序使用的另一个表中,即导入表中。这是一个非常简单的文件,它只是列出了导出标识符的名称。理论上,链接器可以使用 DLL 本身来解决这个问题。实际上这不起作用,因为导出的名称不必与实际名称匹配。

静态库(.lib)和导入库(.lib)有什么区别

静态库包含链接到使用该库的项目的代码。导入库不包含代码,只是提示代码在其他地方可用。

是windows特有的现象吗?

大致,是的。Unix 具有相同的概念,但实现方式却大不相同。

于 2015-10-29T16:35:51.267 回答