如何创建无.OBJs 32-位导入库或源

文章翻译 文章翻译
文章编号: 131313 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文介绍了如何创建导入库给出您具有未源代码或对象模块的.dll。与 16 位版本的 Visual c + + 时是没有 32-位实用程序,可以从一个.dll 创建导入库。

: 此方法可能不适用于使用非 Microsoft 开发工具生成的 dll。

更多信息

通常情况下,生成.dll 或导出的函数或数据项导入库和导出文件) 的任何目标生成时作为链接的过程的一部分。但在第三方.dll 的没有随提供与导入库的情况下,您可能需要以使用成功使用加载时动态链接该.dll 中生成导入库。导入库,则不需要的运行时动态链接。

有两种方法可以创建导入库给定.dll:
  • 使用 LIB/DEF 创建.def 文件中的,以便使用: 命令。
  • 某些功能,存根和使用以模仿导入/导出关系创建.obj 文件。然后,使用 LIB/DEF: 命令来创建导入库。

创建.def 文件

只有您可以使用.def 文件从您不具有源代码.dll 创建导入库或对象模块是如果该.dll 导出函数通过 C 的接口。专门,函数需要已声明使用 C 调用约定。这是通过 _cdecl 属性通常用于在原型中指定的。请注意是否指定没有属性,则 _cdecl 是默认值时 /Gz (_stdcall 是默认值) 或 /Gr (_fastcall 是默认设置) 在 CL 命令行上未指定。此限制的原因基于假设所作的所有名称会自动都导出不带前导下划线的 LIB 实用工具。这是仅为 _cdecl 函数名,则返回 true。

使用通过 C 的接口中导出的函数,给出一个.dll,您可以通过执行以下步骤创建导入库:
  1. 使用 DUMPBIN /EXPORTS <.dll 文件的名称 > 来获得问题的.dll 导出符号列表。该符号出现在表的"名称"列中的标题是"序号提示名。
  2. 创建一个包含与名称函数 DUMPBIN 输出的"名称"列中列出的一个导出部分的.def 文件。
  3. 对于 _cdecl 函数就像它将在调用程序中使用时,将显示该符号。 只需将该符号放到.def 文件导出一节中。
  4. 使用 LIB/DEF: <.def 文件的名称 > 生成导入的库和导出文件。导入库的基名称将是到.def 文件的基名称。 使用/OUT: 控制输出库的名称。

stubbing 出函数

对于使用 C 以外的调用约定的导出函数,这种情况是更复杂。当您考虑 c + + 函数和更复杂的名称修饰方案涉及这更是如此。若要用于此方法,您必须至少具有描述.dll 的接口的头文件。

要从在头文件中的原型创建存根的函数,请执行以下操作:
  1. 原型或声明中使用"__declspec(dllimport)"时,将其更改为"__declspec(dllexport)。
  2. 函数的执行不返回一个值中 C 的源中的 C 函数和 (与 extern"C"' 构造一起使用) 的 c + + 源代码中的 C 函数,替换分号的终止与一对匹配的大括号 ({) 函数原型。
  3. 对于 c + + 函数 (全局或成员) 的返回值,必须创建虚拟正文为功能,返回虚拟正确类型的值。(无需在函数中的返回语句是非法。 这会类成员函数,以及。请记住,此过程的目的是诱使 LIB 实用程序中生成正确的导入媒体库,以便这些虚拟主体没有任何效果。
  4. 对于 c + + 类,您可以存根出在类声明中使用原型成员功能,只要禁用内联函数时编译。
  5. 通常只是由在头文件中的类型指定函数参数。 例如对于 Geta(int)。添加虚拟函数体 Geta(int x) 时,必须指定一个虚拟的参数标识符。否则为 C2055 会生成此错误。

示例

如果描述 MYDLL.DLL 的头文件如下所示:
// mydll.H

extern "C" __declspec(dllimport) void _stdcall Function(void);

class __declspec(dllimport) CMyClass {
     int a;
     long b;
public:
     int Geta(int);
     long Getb();
     CMyClass();
};
				
应类似于您使用来生成导入库虚拟源文件:
 // mydll.CPP

 extern "C" __declspec(dllexport) void _stdcall Function(void) {}

 class __declspec(dllexport) CMyClass {
      int a;
      long b;
 public:
      int Geta(int x) {return 111;}
      long Getb() {return 111;}
      CMyClass() {}
 };
				
一旦函数 stubbed,所有您要做的只是将该源文件编译为一个.obj 文件:
CL/c /Ob0 mydll.CPP
注: 禁用函数内联到强制的符号的生成 CMyClass 中定义的函数的需要。如果启用了函数内联,编译器会注意到,它将放弃函数体没有任何指向成员函数,在翻译单位中的引用。有关优化在 Visual c + + CL 命令行引用中的内联函数展开,请参阅讨论。

在您有了.obj 文件后,您可以使用 LIB/DEF: 创建导入库 (.LIB) 和导出 (.EXP) 文件:
LIB/DEF: mydll.OBJ
LIB 命令的详细信息,请参阅"LIB 参考"Visual c + + 联机丛书中。

参阅下面 Microsoft 知识库中相应的文章:
140485导出 PASCAL 类似 32 位 dll 中的符号

属性

文章编号: 131313 - 最后修改: 2004年6月29日 - 修订: 2.1
这篇文章中的信息适用于:
  • The Microsoft Library Manager (LIB.EXE)?当用于
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 标准版
    • Microsoft Visual C++ 5.0 标准版
关键字:?
kbmt kb3rdparty kbcode kbhowto KB131313 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 131313
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com