c++ exports def文件

https://msdn.microsoft.com/zh-cn/library/hyx1zcd3(v=vs.80).aspx

EXPORTS

引入了一个由一个或多个 definitions(导出的函数或数据)组成的节。每个定义必须在单独一行上。

EXPORTS
definitions

备注

EXPORTS 关键字可以在第一个定义所在的同一行或前一行上。.def 文件可以包含一个或多个 EXPORTS 语句。

导出 definitions 的语法为:

          entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]

entryname 是要导出的函数名或变量名。这是必选项。如果导出的名称与 DLL 中的名称不同,则通过 internalname 指定 DLL 中导出的名称。例如,如果 DLL 导出函数 func1(),要将它用作 func2(),则应指定:

EXPORTS
func2=func1

@ordinal 允许指定是序号而不是函数名将进入 DLL 的导出表。这有助于最小化 DLL 的大小。.LIB 文件将包含序号与函数之间的映射,这使您得以像通常在使用 DLL 的项目中那样使用函数名。

可选的 NONAME 关键字允许只按序号导出,并减小结果 DLL 中导出表的大小。但是,如果要在 DLL 上使用 GetProcAddress,则必须知道序号,因为名称将无效。

可选的 PRIVATE 关键字禁止将 entryname 放到由 LINK 生成的导入库中。它对同样是由 LINK 生成的图像中的导出无效。

可选的 DATA 关键字指定导出的是数据,而不是代码。例如,可以导出数据变量,如下所示:

EXPORTS
i DATA

当对同一导出使用 PRIVATEDATA 时,PRIVATE 必须位于 DATA 的前面。

有三种导出定义的方法,按照建议的使用顺序依次为:

  1. 源代码中的 __declspec(dllexport) 关键字

  2. .def 文件中的 EXPORTS 语句
  3. LINK 命令中的 /EXPORT 规范

所有这三种方法可以用在同一个程序中。LINK 在生成包含导出的程序时还创建导入库,除非生成中使用了 .exp 文件。

以下是 EXPORTS 节的示例:

EXPORTS
   DllCanUnloadNow      @1     PRIVATE   DATA
   DllWindowName = Name        DATA
   DllGetClassObject    @4 NONAME   PRIVATE
   DllRegisterServer    @7
   DllUnregisterServer

注意,使用 .def 文件从 DLL 中导出变量时,不需要在变量上指定 __declspec(dllexport)。但是,在任何使用 DLL 的文件中,仍必须在数据声明上使用 __declspec(dllimport)

时间: 2024-10-11 07:35:32

c++ exports def文件的相关文章

VC2010 利用 def 文件生成 dll 文件的方法

近期有个需求,要生成一个dll 文件.文件里的函数都是採用 stdcall 函数调用约定,可是不希望函数名被修饰(add 被修饰成 [email protected]). 这时就要用def 文件了. 比方我有以下两个函数: extern "C" int _stdcall add(int a, int b) { return a + b; } extern "C" int _stdcall sub(int a, int b) { return a - b; } def

关于DLL的导出.def文件

1.VS2012创建.def文件 右键工程名->add->New Item->Visual C++->Code->Module-Define File(.def) 2.def文件的编写 一个def文件必须有两个部分:LIBRARY和EXPORTS 让我们先看一个基本的.def文件稍后我将解析 LIBRARY dll_tutorial DESCRIPTION "our simple DLL" EXPORTS Add @1 Function @2 第一行,''

extern "C" 和 DEF 文件.

参考: http://www.cnblogs.com/whiteyun/archive/2011/07/22/2113560.html 问题: 如果用了 DEF 文件来导出 DLL 的函数, 还需要在导出的函数声明前面加 extern "C" 吗? DEMO 下载: http://pan.baidu.com/s/1kTTY6rH extern "C" 的目的是告诉 C++ 编译器不要对函数名进行改名处理(以便支持函数重载), 而是按照 C 编译器的方式, 不对函数名

由.def文件生成lib文件[转]

最近在学习curl库时,碰到一个问题,从官网上下载了一个lib版的,却发现只有.dll,没有lib文件,感觉很奇怪,google了之后才知道,原来库作者的用意是让用户自己生成lib文件,下载到的lib文件中含有.def文件.唉,用了vs有几个年头了,却连这么基础的问题都不知道,编译器是变得越来越智能了,只是让我们变得越来越傻了.下边我总结了一下由.def生成lib的方法. 在使用 VC 链接 dll 时,通常需要一个导入库文件(.lib),但有时我们只有一个 dll 文件,怎么办呢? 通常,在链

VC2010 利用 def 文件生成 dll 文件的方法 转载

最近有个需求,要生成一个dll 文件,文件中的函数都是采用 stdcall 函数调用约定,但是不希望函数名被修饰(add 被修饰成 [email protected]).这时就要用def 文件了. 比如我有下面两个函数: [cpp] view plain copy extern "C" int  _stdcall add(int a, int b) { return a + b; } extern "C" int  _stdcall sub(int a, int b

VS制作dll、def文件的使用、dll加入工程使用

1.VS新建工程,在选项的时候,选择dll和空项目,保持干净的dll库: 创建完以后,添加头文件以及源文件. 2.将外部模块使用的接口导出: (1)函数导出: __declspec(dllexport) int add(int a, int b) { return a+b: } (2)类导出: class __declspec(dllexport) testClass() { testClass(); ~testClass(); } 3.直接buiild以后,在debug或者release的目录

利用def生成dll文件

DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport),这里不再举例说明:另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出.属性及其他方面的信息.            首先创建 一个DLL程序,.cpp中int __stdcall Add(int numa, int numb){       return (numa + numb);} int __stdcall Sub(int numa, int n

模块定义文件.def

一作用 DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport),这里不再举例说明:另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出.属性及其他方面的信息. 在链接器阶段可以使用 /DEF(指定模块定义文件)链接器选项调用 .def 文件.如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度. 二原因 在VC++中,生成DLL可以不使用.def文件.只需要在VC++的函数定

DLL中__declspec(dllexport)和.def(模块定义文件)定义导出函数的一点区别

原想是不在DLL中使用.def文件的,直接在需要导出的函数前加__declspec(dllexport)修饰.但在是要导出STDAPI __declspec(dllexport) DllGetClassObject的时候,就提示"warning C4518: “__declspec(dllexport ) ” : 此处遇到意外的存储类或类型说明符:被忽略"(我用的是vc.net 2003). STDAPI这个宏扩展出来是extern "C" HRESULT __st