未解决的外部符号错误仅在64位模式下发生,而不是在32位构建中发生

时间:2013-08-26 06:25:53

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

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

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

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

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

我当然在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)64-bit build

2) 64-bit build for each project in COnfiguration properties page

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

通过查看另一个stackoverflow链接,我看到“Project Configuration properties - > Linker-> Advanced->还有一个settoing;目标机器默认为”not set“ 如果我制作目标机器==“MACHINEx64”,我会得到一种不同的错误,我之前得到的错误::

  

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

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

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

4 个答案:

答案 0 :(得分:5)

从外观上看,您只需将项目的一半更改为x64,其余部分保留为Win32。既然你没有显示你的项目的依赖关系,很难猜测是否存在问题...无论如何,为了使编译成功,你必须将所有依赖项目(libs)切换到x64!

答案 1 :(得分:4)

该致命错误LNK1112表示您在尝试创建64位可执行文件时确实以32位模式链接某些内容。

图像2)仅显示某些,但不显示64位模式下的所有项目。这听起来很麻烦!

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

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

指向lib32lib64目录,具体取决于目标体系结构。

答案 2 :(得分:2)

旧线程,我知道,但发现我必须向DEF文件添加“Explicit”导出才能使其工作。必须是32位隐式添加,但64不是。希望这有助于某人:)

答案 3 :(得分:1)

我想我弄清楚问题是什么。

AAA.EXE正在使用Logger.lib静态库,而后者又调用了WTTLog.DLL中的函数。此Microsoft DLL“WTTLog.DLL”是一个32位DLL。

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

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

“我在哪里可以找到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