Se produce un error LNK2005 cuando la biblioteca de CRT y bibliotecas MFC se vinculan en el orden equivocado en Visual C++

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 148652
Síntomas
Cuando la biblioteca de tiempo de ejecución de C (CRT) y Microsoft Foundation Se vincularán las bibliotecas de Class (MFC) en un orden incorrecto, puede recibir uno de los errores de LNK2005 siguientes:
NAFXCWD.lib(afxmem.obj): Error LNK2005:
"void * __cdecl operator new (unsigned int)" (??2@YAPAXI@Z) ya
definido en LIBCMTD.lib(new.obj)
NAFXCWD.lib(afxmem.obj): error LNK2005:
"operador void __cdecl Delete(void *) "(??3@YAXPAX@Z) ya definido
en LIBCMTD.lib(dbgnew.obj)
NAFXCWD.lib(afxmem.obj): error LNK2005:
"void * __cdecl operator new (unsigned int, int, char const *, int)"
(??2@YAPAXIHPBDH@Z) ya está definido en LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj): error LNK2005: _DllMain@12 ya está definido en
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): error LNK2005: _DllMain@12 ya está definido en
MSVCRTD.lib(DllMain.obj)
Causa
Las bibliotecas CRT utilizan vinculación externa débil para las funciones nuevo, eliminar y DllMain. Las bibliotecas MFC también contienen las funciones nuevas, eliminar y DllMain. Estas funciones requieren las bibliotecas MFC que se vincularán antes de la biblioteca CRT se vincula la biblioteca.

Solución
Hay dos formas de resolver este problema. La primera solución implica forzando al vinculador que se vinculan bibliotecas en la correcta orden. La segunda solución le permite encontrar el módulo que está causando la problema y corregirlo.

Nota Los siguientes pasos se basan en Visual C++ 6.0.

Solución uno: Fuerza vinculador a bibliotecas de vínculos en el orden correcto

  1. En el Proyectomenú, haga clic en Configuración de.
  2. En el Configuración de para ver de laConfiguración del proyecto cuadro de diálogo, haga clic para seleccionar el proyecto configuración que obtiene los errores de enlace.
  3. En el Vínculo ficha, haga clic para seleccionar Entradaen el Categoría cuadro combinado.
  4. En el Pasar por alto bibliotecas cuadro, introduzca los nombres de biblioteca (para en el ejemplo se, NAFXCWD;LIBCMTD.lib).

    Nota El equivalente de la línea de comandos del vinculador en la opción /NOD:<library name=""></library>.
  5. En el Módulos de objeto/biblioteca cuadro de, insertar los nombres de biblioteca. Debe asegurarse de que éstos se muestran en orden y como las dos primeras bibliotecas en la línea (por ejemplo, NAFXCWD LIBCMTD.lib).
Para establecer esta opción en Visual C++. NET, lea la "configuración de Visual Tema de ayuda en pantalla de las propiedades del proyecto de C++".

Solución dos: Localice y corrija el módulo de problema

Para ver la orden de enlace de biblioteca actual, siga estos pasos:
  1. En el Proyectomenú, haga clic en Configuración de.
  2. En el Configuración de para ver de laConfiguración del proyecto cuadro de diálogo, haga clic para seleccionar el proyecto configuración que obtiene los errores de enlace.
  3. En el Vínculo ficha, escriba/ verbose: lib en el Opciones de proyectocuadro de.
  4. Vuelva a generar el proyecto. Las bibliotecas se mostrarán en la ventana de salida durante el proceso de vinculación.
Estado
Esto comportamiento es así por diseño.
Más información
Cuando utiliza las bibliotecas MFC, debe asegurarse de que se vinculan antes de que está vinculada la biblioteca CRT. Para ello, lo que asegurarse de que todos los archivos en el proyecto incluyen Msdev\Mfc\Include\Afx.h en primer lugar, ya sea directamente (# incluyen <Afx.h>) o indirectamente (# incluyen <Stdafx.h>). La Afx.h incluyen las fuerzas de archivo el orden correcto de la bibliotecas, mediante el uso del comentario de #pragma (lib,"<libname>") la directiva. </libname></Stdafx.h></Afx.h>

Si el archivo de origen tiene una extensión .c o el archivo tiene un .cpp extensión pero no utilizan MFC, puede crear e incluir un archivo de encabezado pequeño (Forcelib.h) en la parte superior del módulo. Este nuevo encabezado garantiza orden de búsqueda de la biblioteca es correcto.

Visual C++ no contiene esto archivo de encabezado. Para crear este archivo, siga estos pasos:
  1. Abra Msdev\Mfc\Include\Afx.h.
  2. Seleccione las líneas entre _AFX_NOFORCE_LIBS de #ifndef y #endif / /! _AFX_NOFORCE_LIBS.
  3. Copiar la selección al Portapapeles de Windows.
  4. Crear un nuevo archivo de texto.
  5. Pegar el contenido del Portapapeles en este nuevo archivo.
  6. Guarde el archivo como Msdev\Mfc\Include\Forcelib.h.

Pasos para reproducir el problema en Visual C++ .NET

  1. Inicie Microsoft Visual Studio. NET.
  2. En el Archivo en el menú, señale aNuevoy, a continuación, haga clic en Proyecto.
  3. Haga clic en Proyectos de Visual C++ bajoTipos de proyectoy, a continuación, haga clic en Aplicación MFCbajo Plantillas.
  4. En el Nombre cuadro de texto, escribaQ148652.
  5. En el Ubicación cuadro de texto, escribaC:\testy, a continuación, haga clic en ACEPTAR.
  6. En el Asistente para aplicaciones MFC cuadro de diálogo, Haga clic en Tipo de aplicación.
  7. Haga clic en En función de cuadro de diálogo bajoTipo de aplicacióny, a continuación, haga clic en Utilizar MFC en una variable static biblioteca bajo Uso de MFC.
  8. Haga clic en Finalizar.
  9. En el Explorador de soluciones, bajo Archivos de código fuenteSeleccione todos los archivos .cpp tres.
  10. Haga clic en los tres archivos seleccionados y, a continuación, haga clic enQuitar.
  11. Con el botón secundario Archivos de código fuente, seleccioneAgregary, a continuación, haga clic en Agregar nuevo elemento.
  12. Haga clic en Archivos de C++ bajoPlantillas. En el Nombre cuadro de texto, escribaAA. Haga clic en Abrir.
  13. Pegue el código siguiente en el archivo Aa.cpp:
    int test(){new int; return 1;}
  14. Con el botón secundario Archivos de código fuente, seleccioneAgregary, a continuación, haga clic en Agregar elemento existente.
  15. Seleccione los siguientes archivos:
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. Haga clic en Abrir.
  17. Los archivos que seleccionó en el paso 15 aparecerán enArchivos de código fuente.
  18. Seleccione todos los archivos .cpp cuatro bajo Código fuente Archivos.
  19. Haga clic en los cuatro archivos .cpp que seleccionó, y, a continuación, Haga clic en Propiedades.
  20. Expanda Propiedades de configuracióny, a continuación, Expanda C O C++.
  21. Haga clic en Encabezados precompilados.
  22. Establecer la Crear o utilizar encabezado precompiladopropiedad a No utilizar encabezados precompilados. Haga clic enACEPTAR.
  23. En el Generación menú, haga clic en Volver a generar Solución.
NAFXCWD

Properties

Article ID: 148652 - Last Review: 12/16/2012 05:07:00 - Revision: 9.0

Microsoft Visual C++ 2008 Express Edition, Microsoft Visual C++ 5.0 Enterprise Edition, Microsoft Visual C++ 5.0 Professional, Microsoft Visual C++ .NET 2002 Standard, Microsoft Visual C++ .NET 2003 Standard

  • kbsweptvs2008 kbtshoot kbarttypeinf kberrmsg kbprb kbmt KB148652 KbMtes
Feedback