You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将32位DLL模块定义移植到64位环境?

64位DLL移植中的模块定义文件问题

问题背景

将应用程序与DLL项目移植到64位环境时,64位配置编译触发以下链接错误:

2>mylib.exp : error LNK2001: unresolved external symbol _func_a@4
2>mylib.exp : error LNK2001: unresolved external symbol _func_b@4

相关代码文件内容如下:

头文件 mylib.h

#ifdef MYLIB_DEF
    #define DLLEXPORT __declspec(dllexport)
#else
    #define DLLEXPORT __declspec(dllimport)
#endif

DLLEXPORT extern int variable;
DLLEXPORT int __stdcall func_a(int value);
DLLEXPORT int __stdcall func_b(int value);

C源文件

#define MYLIB_DEF
#include "mylib.h"

DLLEXPORT int variable;

DLLEXPORT int __stdcall func_a(int value)
{
...
}

原模块定义文件 mylib.def

LIBRARY mylib.dll
EXPORTS
variable DATA
_func_a@4
func_a@4=_func_a@4
func_a=_func_a@4
_func_b@4
func_b@4=_func_a@4
func_b=_func_a@4

替代模块定义文件

LIBRARY mylib.dll
EXPORTS
variable DATA
func_a
func_b

替代文件编译通过,但存在以下疑问:


疑问解答

  1. 此替代文件是否适用于64位构建?
    完全适用。64位MSVC环境下,所有函数调用约定统一为__fastcall(且无法修改),函数导出时不会生成_func@N这类带参数长度的修饰名。替代文件里直接导出func_a、func_b,和64位编译后的实际符号名完全匹配,不会再触发链接错误。

  2. 若已全局使用__declspec(dllexport)且不使用序号导出,是否还需要模块定义文件?
    不需要。__declspec(dllexport)已经可以自动导出指定的符号(函数、变量),如果不需要控制导出序号、别名,或者不需要隐藏其他未标记的符号,模块定义文件是多余的。

  3. 64位构建是否可直接丢弃该文件,或它仍有价值?
    可以直接丢弃。64位下用__declspec(dllexport)足够完成导出需求,模块定义文件在这里没有额外价值——除非你有特殊需求,比如强制指定导出名称(和函数原名不同)、设置导出序号,或者要排除某些意外导出的符号,但你的场景里没有这些需求。

  4. 32位构建中丢弃该文件是否会影响外部用户?
    会影响。原模块定义文件里给func_a、func_b设置了多个别名:_func_a@4(标准__stdcall修饰名)、func_a@4、func_a。如果外部用户的代码是用无修饰的func_a来调用,或者用func_a@4来链接,丢弃.def文件后,__declspec(dllexport)只会导出标准修饰名_func_a@4,这些用户的代码会触发链接错误。如果外部用户都是用头文件里的声明(自动处理__stdcall修饰)来调用,丢弃.def文件可能没问题,但如果有依赖别名的旧代码,就会出问题。

  5. 32位构建中每个函数为何需要两个额外别名?这是标准做法吗?64位是否有等效操作?

  • 32位里设置这些别名是为了兼容不同的调用方式:_func_a@4是__stdcall的标准修饰名,func_a@4和func_a是无下划线的别名,目的是让外部代码不管是用修饰名还是原名都能链接到该函数,比如有些编译器或者旧代码可能会用不带下划线的符号名来查找函数。这属于兼容旧代码的非标准做法,不是必须的标准操作。
  • 64位下没有等效操作,因为64位只有一种调用约定,函数导出只有无修饰的原名,不需要设置别名来兼容不同的符号格式。

内容的提问来源于stack exchange,提问作者penguin359

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:40:24