7
votes

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) 64-bit build

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

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.

4
what is this CWTTLogger class, is it something from one of your libs?codeling
There can be several things that could be the problem but no reason is visible in what you have shown. Most obvious question is: you are certain you are rebuilding the lib in 64-bit and linking against it and not 32-bit version by accident?CygnusX1
I have added more details on what all settings I did for changing the 32-bit version to a 64-bit version AAA.EXE. Yes, CWTTLOgger is my class name in the libraries (.lib) I have defined.codeLover
Would like to clarify that my static libraries (.lib) are present in another solution and I have changes all of them to x64. In the snapshot I have shown each project is an indivisual EXE and have no relationship/dependency on another project of the same solution. All my libraries A.lib,B.lib etc... are all present in another solution. –codeLover

4 Answers

5
votes

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!

4
votes

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.

2
votes

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 :)

1
votes

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