问题
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
来源:https://stackoverflow.com/questions/18437875/unresolved-external-symbol-error-occurring-only-in-64-bit-mode-and-not-in-32-bit