首页 文章

构造.dll文件和中间.lib

提问于
浏览
-1

以下是link1.的摘录

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

我在一定程度上理解了上述段落,但不是很好 .

以下是link2.的摘录

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

现在,这让我很困惑,让我问下面的问题:

  • 用简单的话,任何人都可以告诉我 exporting 这个词究竟是什么意思吗?我相信这使得一个对象可以从一个代码访问到另一个 - 但是嘿!!

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

  • 生成.dll后,.lib(所谓的导入文件)的用途是什么 . 可以安全删除吗?

  • ARRGGGH !!静态库(.lib)和导入库(.lib)之间有什么区别?大错,对吧?但还是!!

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

如果问题尚未清楚,请随时重新解释 .

1 回答

  • 2

    告诉我出口这个词究竟意味着什么?

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

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

    可能是非常古老的项目 . 或者它从未作为一个旨在创建单独模块的项目启动 . 像静态库一样,源代码没有 __declspec 属性 . 跨平台库很可能适合该法案 . C和C语言规范仍无法以标准化方式创建模块 . 每个人都这样做,没有人以同样的方式做到这一点 . 大量的时间流失 .

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

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

    静态库(.lib)和导入库(.lib)之间的区别是什么

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

    窗户是否有特定现象?

    粗略地说,是的 . Unix具有相同的概念,但实现方式却截然不同 .

相关问题