【问题标题】:Unresolved external symbol error occurring only in 64-bit mode and not in 32-bit build未解决的外部符号错误仅发生在 64 位模式而不是 32 位构建中
【发布时间】:2013-08-28 13:46:10
【问题描述】:

我有一个 VC++ 代码(使用 VS2008 构建),它使用了一些静态库(*.lib 文件在编译时静态链接)。

为了便于理解,我们将我的 EXE 代码称为“AAA.EXE”,并将 lib 文件称为“A.lib”、b.lib 等...

AAA.EXE 代码和静态库代码都是使用 VS2008 构建的。

我看到我的“AAA.EXE”在 32 位版本中运行良好,并且在 AAA.EXE 以 64 位模式构建时显示以下链接器错误。

我当然已经在 64 位模式下重建了静态库,并在我的 AAA.EXE 中提供了 lib 路径,如下所示 ::“与 AAA.EXE 对应的项目配置属性 -> 链接器 -> 常规/输入”。

这个链接器错误确实困扰了我很长时间。任何帮助是极大的赞赏。

Logger.lib(Loggerr.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall CWTTLogger::CWTTLogger(void)" (__imp_??0CWTTLogger@@QAE@XZ)    

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall CWTTLogger::~CWTTLogger(void)" (__imp_??1CWTTLogger@@UAE@XZ)    

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: long __thiscall CWTTLogger::FunctionA(unsigned short *,long *)" (__imp_?FunctionA@CWTTLogger@@QAEJPAGPAJ@Z)     

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: long __thiscall CWTTLogger::FunctionB(unsigned short *,long)" (__imp_?FunctionB@CWTTLogger@@QAEJPAGJ@Z)     

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: long __thiscall CWTTLogger::FunctionC(unsigned short *,unsigned long,unsigned short *,long)" (__imp_?FunctionC@CWTTLogger@@QAEJPAGK0J@Z)     

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: long __cdecl CWTTLogger::FunctionD(unsigned long,long,...)" (__imp_?FunctionD@CWTTLogger@@QAAJKJZZ)             

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: long __thiscall CWTTLogger::FunctionE(unsigned short *,long)" (__imp_?FunctionE@CWTTLogger@@QAEJPAGJ@Z)         


1>C:\Users\User1\Documents\XYZ\Code\64bit\aaa.exe: fatal error LNK1120: 7 unresolved externals

还要添加::

我对设置进行了 2 处更改,以使我的 AAA.exe 代码从 32 位变为 64 位:: 1)

2)

当然,代码兼容 32 位和 64 位。 VC2008 中的这 2 项设置更改是否已完成以使 32 位 AAA.exe 代码成为 64 位构建?

通过查看另一个stackoverflow链接,我看到“项目配置属性->链接器->高级->目标机器默认设置为“未设置”中还有一个设置 如果我让目标机器==“MACHINEx64”,我会得到一种不同类型的错误,这是我之前得到的::

“致命错误LNK1112:模块机器类型'X86'与目标冲突 机器类型'x64'"

我真的不清楚是否应该将链接器选项中的“目标机器”字段设置为“未设置”或“MACHINEx64”?

如果是“是”,我需要弄清楚如何解决问题。

【问题讨论】:

  • 这是什么CWTTLogger 类,它来自您的某个库吗?
  • 可能有几件事可能是问题所在,但在您显示的内容中没有可见的原因。最明显的问题是:您确定您正在重建 64 位的库并链接它,而不是偶然的 32 位版本?
  • 我添加了更多关于我为将 32 位版本更改为 64 位版本 AAA.EXE 所做的所有设置的详细信息。是的,CWTTLOgger 是我定义的库 (.lib) 中的类名。
  • 想澄清一下,我的静态库 (.lib) 存在于另一个解决方案中,并且我已将它们全部更改为 x64。在快照中,我展示了每个项目都是一个独立的 EXE,并且与相同解决方案的另一个项目没有关系/依赖关系。我所有的库 A.lib、B.lib 等...都存在于另一个解决方案中。 ——

标签: c++ visual-c++ 32bit-64bit linker-errors unresolved-external


【解决方案1】:

从外观上看,您只是将一半的项目更改为x64,而将其余项目更改为Win32。由于您没有显示项目的依赖关系,因此很难猜测这是否有问题......无论如何,为了编译成功,您必须将所有依赖项目(库)切换到 x64!

【讨论】:

  • 想澄清一下,我的静态库 (.lib) 存在于另一个解决方案中,并且我已将它们全部更改为 x64。在快照中,我展示了每个项目都是一个独立的 EXE,并且与相同解决方案的另一个项目没有关系/依赖关系。我所有的库 A.lib、B.lib 等...都存在于另一个解决方案中。
  • 您是否也在使用特定于平台的输出目录?例如“$(解决方案目录)$(配置)\$(平台)\”?否则,它们可能会从不同的构建中混淆
  • 是的,我正在使用平台特定的输出目录。我不确定,我该如何摆脱这个困扰我很久的错误。
【解决方案2】:

致命错误 LNK1112 表明您在尝试创建 64 位可执行文件时确实在 32 位模式下链接了某些东西。

图片 2) 仅显示 一些 但不是所有 64 位模式的项目。这听起来很麻烦!

也许问题出在您的 LIB 目录上? 通常我的项目(这里是 VS2010)的不同之处在于:

Project Properties -> VC++ Directories -> Library Directories

根据目标架构指向lib32lib64 目录。

【讨论】:

  • 想澄清一下,我的静态库 (.lib) 存在于另一个解决方案中,并且我已将它们全部更改为 x64。在快照中,我展示了每个项目都是一个独立的 EXE,并且与相同解决方案的另一个项目没有关系/依赖关系。我所有的库 A.lib、B.lib 等...都存在于另一个解决方案中。 ——
  • 但是您在某个地方也有 32 位库,对吧?它们可能使用相同的名称但路径不同(我在错误消息中看到“Logger.lib”名称,而不是“Logger32.lib”或“Logger64.lib”)。我的意思是 - 你确定 64 位的 lib 路径设置正确吗?
【解决方案3】:

旧线程,我知道,但发现我必须将“显式”导出添加到 DEF 文件才能使其工作。一定是 32 位是隐式添加的,但 64 位不是。希望这可以帮助某人:)

【讨论】:

    【解决方案4】:

    我想我找到了问题所在。

    AAA.EXE 使用 Logger.lib 静态库,而后者又调用 WTTLog.DLL 中的函数。而这个 Microsoft DLL "WTTLog.DLL" 是一个 32 位的 DLL。

    这就是它在 64 位 AAA.EXE 中不适合我的原因。

    所以我确实找到了我在这个线程中提出的问题的答案,即如何在 64 位应用程序中链接 64 位库。但这仍然给我留下了一个问题,

    “我在哪里可以找到 WTTLog.DLL 的 64 位版本 WTTLog.lib 和“wttlogger.h”。 为此我创建了一个新线程,因为现在问题不同了。

    How to get the WTTLog.lib and wttlogger.h header file for 64-bit version of WTTLog.DLL

    【讨论】:

      猜你喜欢
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 2014-02-28
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      相关资源
      最近更新 更多