Unresolved external symbol error occurring only in

2019-02-24 04:06发布

问题:

I have a VC++ code (built using VS2008), which makes use of some static libraries (*.lib files linked statically during compile time).

For ease of understanding let's refer my EXE code as "AAA.EXE" & refer the lib files as "A.lib", b.lib etc...

Both the AAA.EXE code and static libraries code are built using VS2008.

I see that my "AAA.EXE" is working fine in 32-bit version and showing the below linker errors when AAA.EXE is built in 64-bit mode.

I have of course rebuilt the static libraries in 64-bit mode and provided the lib path in my AAA.EXE like this :: "Project Configuration Properties corresponding to AAA.EXE -> Linker -> General/Input".

This linker error is really bothering me form a long time. Any help is greatly appreciated.

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

Also to add ::

I have done 2 changes in the settings to make my AAA.exe code 64-bit from 32-bit:: 1)

2)

Ofcourse the code is compatible for both 32-bit & 64-bit. Are these 2 settings changes in VC2008 complete for making the 32-bit AAA.exe code 64-bit build?

By looking at another stackoverflow link I see there is one more settoing in "Project Configuration properties -> Linker-> Advanced-> Target machine is default to "not set" and if I make target machine == "MACHINEx64", I get a different sort of error which I was getting earlier ::

"fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'"

I'm really not having a clarity on if I should be setting the "Target machine" field in linker option as "Not Set" or "MACHINEx64"?

If it's a "YES", I need to figure out how to fix the problem.

回答1:

From the looks of it, you're only changing half of your projects to x64 and leave the rest to Win32. Since you don't show your project's dependencies, its hard to guess if that's a problem or not ... in any case, for compilation to succeed you'll have to switch all of the dependent projects (libs) to x64!



回答2:

That fatal error LNK1112 indicates that you are indeed linking something in 32-bit mode when trying to create a 64-bit executable.

The image 2) shows only some but not all projects in 64-bit mode. This sounds like trouble!

Perhaps the problem lies in your LIB directory? Usually my projects (VS2010 here) differ at:

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

which points to lib32 or lib64 directory depending on the target architecture.



回答3:

Old Thread, I know, but found that I had to add "Explicit" exports to the DEF file to get it to work. Must be that the 32-bit was implicitly adding, but the 64 was not. Hope this helps someone :)



回答4:

I think I figured out what the problem was.

AAA.EXE was using Logger.lib static library which in turn was calling the functions in WTTLog.DLL. And this Microsoft DLL "WTTLog.DLL" is a 32-bit DLL.

That is the reason it wasn't working for me in 64-bit AAA.EXE.

So I did find the answer to the question I raised in this thread i.e how to link 64-bit libraries in a 64-bit application. BUt still this leaves me with one more question,

"Where do i find the 64-bit version WTTLog.lib and "wttlogger.h" for WTTLog.DLL. For this I have created a new thread because, the problem is different now.

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