/EXPORT(导出函数)

按名称或序号或数据从程序导出函数。

语法

/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]

备注

/EXPORT 选项指定要从程序导出的函数或数据项,以便其他程序可以调用该函数或使用该数据。 导出通常在 DLL 中定义。

entryname 是函数或数据项的名称,它要供调用程序使用。 ordinal 在 1 到 65,535 范围内指定导出表的索引;如果不指定 ordinal,LINK 会分配一个。 NONAME 关键字仅将函数导出为序号,不带有 entryname

DATA 关键字指定导出的项为数据项。 必须使用 extern __declspec (dllimport) 声明客户端程序中的数据项。

可通过采用建议的使用顺序列出的四种方法导出定义:

  1. 源代码中的 __declspec(dllexport)

  2. .def 文件中的 EXPORTS 语句

  3. LINK 命令中的 /EXPORT 规范

  4. 源代码中的 comment 指令,形式为 #pragma comment(linker, "/export: definition ")

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

LINK 使用修饰形式的标识符。 编译器在创建 .obj 文件时修饰标识符。 如果 entryname 以未修饰形式(如源代码中所显示)指定给链接器,则 LINK 会尝试匹配该名称。 如果找不到唯一匹配,LINK 会发出错误消息。 需要将标识符指定给链接器时,请使用 DUMPBIN 工具获取标识符的 修饰名 形式。

注意

请勿指定声明 __cdecl__stdcall 的 C 标识符的修饰形式。

如果你需要导出未修饰的函数名称,并且根据生成配置(例如,在 32 位或 64 位构建中)具有不同的导出,可以针对每个配置使用不同的 DEF 文件。 (DEF 文件中不允许使用预处理器条件指令。)可以改为在函数声明之前使用 #pragma comment 指令,如此处所示,其中 PlainFuncName 是未修饰名,_PlainFuncName@4 是函数的修饰名称:

#pragma comment(linker, "/export:PlainFuncName=_PlainFuncName@4")
BOOL CALLBACK PlainFuncName( Things * lpParams)

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 选择“配置属性”>“链接器”>“命令行”属性页 。

  3. 将该选项输入“附加选项”框中。

以编程方式设置此链接器选项

另请参阅

MSVC 链接器参考
MSVC 链接器选项