使用.def文件的优点和缺点

时间:2018-03-07 17:12:52

标签: c++ windows dll shared-libraries declspec

我不明白这一段:

  

在.def文件中导出函数可让您控制导出序数。将导出的函数添加到DLL时,可以为其分配比任何其他导出函数更高的序数值。执行此操作时,使用隐式链接的应用程序不必与包含新函数的导入库重新链接。如果您正在设计DLL供许多应用程序使用,这非常方便,因为您可以添加新功能并确保它继续与已经依赖它的应用程序一起正常工作。例如,MFC DLL是使用.def文件构建的。

为什么在函数添加到dll的情况下,如果使用.def文件而不是__declspec(dllexport),应用程序不必重新链接导入库?

cf https://docs.microsoft.com/en-us/cpp/build/determining-which-exporting-method-to-use

2 个答案:

答案 0 :(得分:1)

这是因为MSFT实现共享对象(或DLL)的一些细节。在Microsoft世界中,为了将功能导入您的流程,您不仅需要共享代码本身(.dll),还需要特殊的“导入”功能。 library - .lib文件。此文件静态链接到您的应用程序(因为它是一个静态库)。这个图书馆提供了胶水'函数名和函数序数之间。

通常,每次发布新版本的DLL时,所有使用它的应用程序都必须与新的随附版本的静态导入库(.lib)重新链接才能使用这个新的DLL图书馆。这是因为在创建新库之后函数序数通常不再有效。但是,如果您使用的是.def文件,则可以手动分配序数,并确保以前可用函数的序数保持相同 - 因此.lib文件仍然有效。

答案 1 :(得分:0)

好的,如果您有.def文件,可以使用它来创建导入库。

即。 MS VC ++为mydll.lib,GCC为mylib-dll.a

编译器和链接器更喜欢自己的二进制格式导入库,通常彼此不兼容。当你的DLL在C / C ++上编写但你的程序是用Ada / FORTRAN / Object Pascal等编写的,或者反之亦然时,这尤其适用。因此.def文件可用于创建兼容的导入库。

段落告诉你一种隐藏导入库中某些函数的方法,手动编辑.DEF文件并指示链接器隐藏一些函数。