【问题标题】:unresolved symbols when linking against vc6 dll/lib链接到 vc6 dll/lib 时出现未解析的符号
【发布时间】:2014-01-02 08:09:12
【问题描述】:

我正在使用 vs2012 创建一个小型包装 dll,链接到另一个使用 VC6 构建的 dll (.lib)。

我收到如下链接错误:

error LNK2019: unresolved external symbol __imp__functionName@8

我将随 vc6 dll 提供的 lib 文件添加到链接行,就像我过去所做的那样……这里有一些版本问题吗? vc6 dll头文件以我认为标准的方式声明函数:

#define DLLIMPORT extern "C" __declspec(dllimport)
DLLIMPORT ULONG WINAPI functionName(...);

在 vc6 lib 文件上使用 dumpbin /exports 显示没有 imp 前缀和“@8”的“functionName”.. 不确定这是否是一个问题,或者只是 dumpbin 对我来说很好和解构。

我不是 Windows 用户,不知道为什么链接器找不到符号...帮助!

【问题讨论】:

  • 寄回去,你不要了。您必须删除 DLLIMPORT 和 WINAPI,但如果它出现在 .h 文件中,这不太可能是正确的。
  • 嗯,感谢您的评论,但为什么我必须放弃 DLLIMPORT 和 WINAPI? DLLIMPORT 告诉编译器/链接器我引用的函数将在 dll 中提供,这是正确的。 WINAPI是调用约定,也是正确的..
  • DLLIMPORT 表示 DLL 有一个 extra 导出,其名称以 __imp 开头。 WINAPI 说调用约定是 __stdcall ,它产生额外的@8。既然用dumpbin.exe找不到这些,就想发回去,对你没用。
  • 那些相同的 H 和 LIB 在另一个项目中使用时还可以吗?还是您第一次尝试使用它们?

标签: c++ visual-studio visual-c++ dll visual-c++-6


【解决方案1】:

解决了!有两个问题:

1) dumpbin /exports 没有显示所有的符号。使用 /all 会显示 __imp_functionName@8 形式的符号。

2) 链接器正在寻找 __imp__ 形式的符号,而不是 vc6 库提供的 __imp_。 google 告诉我这是 32 位和 64 位版本之间的区别,所以 vc6 库是 64 位版本,而我的是 32 位版本。

将我的包装 dll 更改为 64 位解决了问题!

这半天时间过得真好!可能是。可能不是。当我喜欢做程序员的时候就是这样!

【讨论】:

  • 一个 64 位 VC6 库?我想当 x64 刚开始时,可​​能已经有一个 amd64 目标版本的cl.exe 12.xx 与一些 Windows SDK 一起分发。但即使该编译器确实存在,用它构建的库似乎也不太可能在今天处理。
  • 导入lib头文件声称编译器是vc6...我不知道。很高兴它现在可以工作了。
  • 有趣。我确实认为,如果链接器可以在您将 x86 与 x64 混合和匹配时通知您,那就太好了。这种问题并不少见,我认为解决方案的线索必须是链接器抱怨的名称中缺少或添加下划线。
猜你喜欢
  • 1970-01-01
  • 2013-07-17
  • 2015-10-11
  • 2020-01-14
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 2011-11-15
相关资源
最近更新 更多