使用导入库和导出文件

当一个程序(可执行文件或 DLL)导出到另一个程序时(后者也在导出),或者如果两个以上的程序同时导出并导入到对方,则链接这些程序的命令必须支持循环导出。

在没有循环导出的情况下,要链接的程序使用的是另一个程序的导出时,必须为导出程序指定导入库。 链接导出程序时会为该导出程序创建导入库。 因此,必须在导入程序之前链接导出程序。 例如,如果 TWO.dll 从 ONE.dll 导入,则必须首先链接 ONE.dll 并获取导入库 ONE.lib。 然后,在链接 TWO.dll 时指定 ONE.lib。 链接器创建 TWO.dll 时,还会创建其导入库 TWO.lib。 链接从 TWO.dll 导入的程序时,请使用 TWO.lib。

但是,在循环导出的情况下,无法使用来自其他程序的导入库来链接所有相互依赖的程序。 在前面讨论的示例中,如果 TWO.dll 还导出到 ONE.dll,则链接 ONE.dll时,TWO.dll 的导入库尚不存在。 当存在循环导出时,必须使用 LIB 为其中一个程序创建导入库和导出文件。

若要开始,请选择其中一个程序,以便在该程序上运行 LIB。 在 LIB 命令中,列出程序的所有对象和库,并指定 /DEF。 如果程序使用 .def 文件或 /EXPORT 规范,请同时指定它们。

为程序创建导入库 (.lib) 和 (.exp) 导出文件后,可以在链接其他某个程序或多个程序时使用导入库。 LINK 为生成的每个导出程序创建导入库。 例如,如果在 ONE.dll 的对象和导出程序上运行 LIB,则创建 ONE.lib 和 ONE.exp。现在可以在链接 TWO.dll 时使用 ONE.lib;此步骤还会创建导入库 TWO.lib。

最后,开始链接你的程序。 在 LINK 命令中,为程序指定对象和库,为程序指定 LIB 创建的 .exp 文件,并为程序使用的导出程序指定导入库或库。 若要继续示例,ONE.dll 的 LINK 命令需包含 ONE.exp 和 TWO.lib,以及进入 ONE.dll 的对象和库。 请勿在 LINK 命令中指定 .def 文件或 /EXPORT 规范;不需要这些,因为导出定义包含在 .exp 文件中。 使用 .exp 文件进行链接时,LINK 不会创建导入库,因为它假定在创建 .exp 文件时已创建一个导入库。

另请参阅

使用导入库和导出文件