PRB: MFC and CRT Must Match in debug/release and static/dynamic

Last reviewed: July 2, 1997
Article ID: Q166504
The information in this article applies to:
  • The Microsoft Foundation Classes (MFC) included with:
  • Microsoft Visual C++, 32-bit Editions, versions 2.0, 2.1, 2.2, 4.0, 4.1, 4.2, 5.0

SYMPTOMS

When the MFC and CRT (C Run-Time) libraries do not match in debug/release or in static/dynamic, you get errors such as the following when linking:

   nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol
   ___argc

Many other strange problems may erupt during build or runtime; memory corruption, memory leaks, complaints from the debug C Run-Time libraries during run-time, and more.

CAUSE

When building an MFC application or DLL, you need to insure that all relevant libraries are in sync:

  • If you have selected to build an app using MFC in the Shared Library, then you must also use the dynamic version of the C Run-Time (MSVCRT.DLL).
  • If you have selected to build a debug MFC application, then you must also use the debug version of the C Run-Time. Similarly, release MFC apps must use the non-debug version of the C Run-Time.
  • If your debug MFC application uses extension DLLs, every extension DLL must be a debug build as well. Again, release apps must match release extension DLLs. The type of C Run-Time library is fixed. Extension DLLs and the applications which use them must all use MFC in the shared library, which requires the dynamic DLL version of the C Run-Time.
  • If you are linking to any static libraries that also link to MFC or the CRT, you should ensure that every static library shares the same properties (debug/release, CRT-static/dynamic) as the application.

RESOLUTION

To change the type of C Run-Time library used by an application or DLL, go to the Build/Project settings property sheet and switch to the C/C++ tab. On the C/C++ page, choose the "Code Generation" category. Change the value of the "Use run-time library" listbox. Pay careful attention to make this specific for each configuration; only one configuration, such as "Win32 (80x86) Debug," should be selected when you change this value.

   Debug, shared library MFC applications - "Debug Multithreaded Dll."

   Release, shared library MFC applications - "Multithread Dll."

   Debug, static library MFC applications - "Debug Multithreaded."

   Release, static library MFC applications - "Multithreaded."

STATUS

This behavior is by design.

REFERENCES

For additional information on C Run-Time options and MFC, please see the following articles in the Microsoft Knowledge Base:

   ARTICLE-ID: Q126646
   TITLE     : PRB: Error Msg: LNK2001 on __beginthreadex and __endthreadex

   ARTICLE-ID: Q128641
   TITLE     : The /Mx Compiler Options and the LIBC, LIBCMT, MSVCRT Libs
 

	
	


Keywords : CRTIss MfcMISC kbbug
Technology : kbMfc
Version : 2.0 2.1 2.2 4.0 4.1 4.2 5.0
Platform : NT WINDOWS
Issue type : kbbug


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: July 2, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.