This article was previously published under Q148652
On This Page
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)
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.
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
1.
On the Project
menu, click Settings.
2.
In the Settings For view of the
Project Settings dialog box, click to select the project
configuration that is getting the link errors.
3.
On the Link tab, click to select Input
in the Category combo box.
4.
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>.
5.
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.
When you use the MFC libraries, you must make sure that
they are linked before the CRT library is linked. You can do this by making
sure that every file in your project includes Msdev\Mfc\Include\Afx.h first,
either directly (#include <Afx.h>) or indirectly (#include
<Stdafx.h>). The Afx.h include file forces the correct order of the
libraries, by using the #pragma comment (lib,"<libname>") directive.
If the source file has a .c extension, or the file has a .cpp
extension but does not use MFC, you can create and include a small header file
(Forcelib.h) at the top of the module. This new header makes sure that
thelibrary search order is correct.
Visual C++ does not contain this
header file. To create this file, follow these steps:
1.
Open Msdev\Mfc\Include\Afx.h.
2.
Select the lines between #ifndef _AFX_NOFORCE_LIBS and
#endif //!_AFX_NOFORCE_LIBS.
3.
Copy the selection to the Windows Clipboard.
4.
Create a new text file.
5.
Paste the contents of the Clipboard into this new file.
Need More Help? Contact a Support professional by Email, Online or Phone.
Customer Service For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
Newsgroups Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.