【问题标题】:Need help resolving linker error LNK2001 visual studio 2010需要帮助解决链接器错误 LNK2001 Visual Studio 2010
【发布时间】:2012-06-13 14:30:17
【问题描述】:

我遇到了一个令人讨厌的链接器错误的问题,希望能找到解决方法的提示。

我理解错误的方式是,链接器无法在“BFStream”类中找到名为“read”的函数的实现。该代码包括 BFStream 类的标头。有一个导入库 QRFound.lib,它接收来自 QRFound.dll 的导出函数。 dll 和 lib 都在文件系统的 lib 目录中。 lib 目录在项目属性中的两个位置提供:VC++ Directories->Library Directories 和 Linker->Additional Library Directories。 QRFound.lib 在 Linker->Input->Additional Dependencies 中指定,并且在列表的第一位。

我知道 QRFound.dll 包含 BFStream::read 的实现,因为我使用依赖项walker 来查看它。但是 C++ 装饰与链接器错误略有不同,这让我很怀疑:?read@BFStream@@QAE_NPADH@Z

链接器错误是:

1>     Creating library C:\MyProj\Debug\MyDisplay.lib and object C:\MyProj\Debug\MyDisplay.exp
1>MyCmdReceiver.obj : error LNK2001: unresolved external symbol "public: bool __thiscall BFStream::read(char *,__int64)" (?read@BFStream@@QAE_NPAD_J@Z)

【问题讨论】:

  • QRFound.dll 的出处是什么?可能是它是用不同的 C++ 编译器构建的,一般来说,从 DLL 导出 C++ 接口是一个糟糕的主意:坚持使用 C 接口或改用 COM。

标签: c++ visual-studio-2010 visual-studio-2008 dll


【解决方案1】:

在您的符号上运行 undname.exe 实用程序会产生:

Undecoration of :- "?read@BFStream@@QAE_NPADH@Z"
is :- "public: bool __thiscall BFStream::read(char *,int)"

所以,是的,显然最后一个参数不匹配,__int64 不匹配 int。您没有发布该方法的实际声明,因此我无法正确猜测这种不匹配是如何发生的。我怀疑这是某种宏汤问题。

【讨论】:

  • 看起来 streamsize 在 iosfwd 中被定义,VS 标头为typedef _Longlong streamsize; 所以我猜我需要在某个地方指定 32 位,因为我在 32 位平台上。不知道会去哪里......
  • 所以 _Longlong 被定义为 _LONGLONG ,它在 yvals.h 中定义为 __int64(也是一个 VS 头文件)。仍在寻找将其更改为 32 位的属性
  • 我可以在没有 dll 源的情况下这样做吗?
  • 我发现一篇 msdn 文章表明 vs2010 认为我的平台是 64 位的,这就是为什么它将流大小定义为 __int64 而不是 int。 msdn.microsoft.com/en-us/library/11zy8h28.aspx
  • 所以由于无法重新编译dll,所以将header的第二个参数函数定义从streamsize改为int,链接成功。
【解决方案2】:

我怀疑您正在调用使用不同编译器构建的 DLL。

如果您有 DLL 的源代码,请使用您当前的编译器构建它:名称修改将保持一致,您应该能够解决问题。

如果您没有 DLL 的源代码,请查看它是否具有 COM 接口。

【讨论】: