Article ID: 148652
Article Last Modified on 1/23/2006
APPLIES TO
- Microsoft Visual C++ 4.0 Standard Edition
- Microsoft Visual C++ 4.1 Subscription
- Microsoft Visual C++ 5.0 Enterprise Edition
- Microsoft Visual C++ 6.0 Enterprise Edition
- Microsoft Visual C++ 5.0 Professional Edition
- Microsoft Visual C++ 6.0 Professional Edition
- Microsoft Visual C++ 6.0 Standard Edition
- Microsoft Visual C++ .NET 2002 Standard Edition
- Microsoft Visual C++ .NET 2003 Standard Edition
This article was previously published under Q148652
SYMPTOMS
When the C Run-Time (CRT) library and Microsoft Foundation
Class (MFC) libraries are linked in the wrong order, you may receive one of the
following LNK2005 errors:
nafxcwd.lib(afxmem.obj) :
error LNK2005:
"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z)
already
defined in LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005:
"void __cdecl operator
delete(void *)"(??3@YAXPAX@Z) already defined
in LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005:
"void * __cdecl operator new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z) already defined in LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj): error LNK2005:
_DllMain@12 already defined in
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): error LNK2005:
_DllMain@12 already defined in
msvcrtd.lib(dllmain.obj)
CAUSE
The CRT libraries use weak external linkage for the new, delete, and DllMain functions. The MFC libraries also contain new, delete, and DllMain functions. These functions require the MFC libraries to be linked
before the CRT library is linked.
RESOLUTION
There are two ways to resolve this problem. The first
solution involves forcing the linker to link the libraries in the correct
order. The second solution allows you to find the module that is causing the
problem and to correct it.
Note The following steps are based on Visual C++ 6.0.
Solution One: Force Linker to Link Libraries in Correct Order
- On the Project
menu, click Settings.
- In the Settings For view of the
Project Settings dialog box, click to select the project
configuration that is getting the link errors.
- On the Link tab, click to select Input
in the Category combo box.
- In the Ignore
libraries box, insert the library names (for
example, Nafxcwd.lib;Libcmtd.lib).
Note The linker command-line equivalent in /NOD:<library name>.
- In the Object/library modules box,
insert the library names. You must make sure that these are listed in order and
as the first two libraries in the line (for example, Nafxcwd.lib
Libcmtd.lib).
To set this option in Visual C++ .NET, read the "Setting Visual
C++ Project Properties" online help topic.
Solution Two: Locate and Correct the Problem Module
To view the current library link order, follow these steps:
- On the Project
menu, click Settings.
- In the Settings For view of the
Project Settings dialog box, click to select the project
configuration that is getting the link errors.
- On the Link tab, type
/verbose:lib in the Project Options
box.
- Rebuild your project. The libraries will be listed in the
output window during the linking process.
STATUS
This
behavior is by design.
Additional query words: nafxcwd
Keywords: kbtshoot kbarttypeinf kberrmsg kbprb KB148652