加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

窗口 – 建立64位dll的警告

发布时间:2020-12-14 01:43:57 所属栏目:Windows 来源:网络整理
导读:dll导出标题 extern "C"void _declspec(dllexport) __stdcall foo(); .def文件 EXPORTSfoo @1 当我通过64位构建配置构建dll时,我遇到这个警告. warning LNK4197: export ‘foo’ specified multiple times; using first specification 但是如果我通过32位构
dll导出标题
extern "C"
void _declspec(dllexport) __stdcall foo();

.def文件

EXPORTS
foo         @1

当我通过64位构建配置构建dll时,我遇到这个警告.

warning LNK4197: export ‘foo’ specified multiple times; using first specification

但是如果我通过32位构建配置构建dll,则警告永远不会发生.
问题是什么?有什么不同.

在dll标题的界面中,我们通常使用这个技术,

#ifdef EXPORT_DLL
#define BASICAPI _declspec(dllexport)
#else
#define BASICAPI _declspec(dllimport)
#endif //_EXPORT_DLL

但是如果def文件也存在,当我们构建64位dll时,我们总是会遇到警告.
那么,我们应该写这样的代码吗?

#ifdef EXPORT_DLL
#define BASICAPI
#else
#define BASICAPI _declspec(dllimport)
#endif //_EXPORT_DLL

运作良好但这对我来说并不熟悉.
给我你的意见

为同一功能指定两次导出通常不是很好的做法.如果您已经有__declspec(dllexport),那么您不需要在.def文件中指定导出.相反,如果您的.def文件中列出导出,则不需要__declspec(dllexport).

我相信警告的原因是,在x86版本中,__declspec(dllexport)正在使用前导下划线导出装饰名称,但64位编译器不会使用前导下划线来装饰名称,从而导致重复.要验证这一点,您可以查看Dependency Walker中的32位DLL,您应该看到两个导出的函数“foo”和“_foo”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读