c++ - error LNK2005: nuevo y eliminar ya definido en LIBCMTD.lib(new.obj)
visual-studio visual-studio-2005 (15)
Para mí, tengo una biblioteca estática compilada con _CRTDBG_MAP_ALLOC, y la aplicación no compilada con _CRTDBG_MAP_ALLOC, recibía entonces LNK2005. Cambié la aplicación para compilar con _CRTDBG_MAP_ALLOC, y el LNK2005 desapareció.
Tengo una solución de Visual Studio 2005 que tiene dos proyectos. Una es una biblioteca estática y la otra es un archivo ejecutable utilizado para probar las funciones en la biblioteca estática. La biblioteca estática usa MFC. Obtuve los siguientes errores cuando construí la solución.
uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (?? 3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj)
No sé cómo superar esto. ¿Puede alguien explicar por qué ocurre este error? Cualquier explicación que proporcione una descripción general del enlace de archivos .lib será muy apreciada.
Asegúrese de que la biblioteca de tiempo de ejecución C ++ con la que está enlazando sea la misma en su biblioteca estática y en su ejecutable. Compruebe las propiedades de su proyecto C / C ++ -> Generación de código-> configuración de biblioteca de tiempo de ejecución.
Compruebe el archivo de manifiesto de ambos proyectos, asegúrese de que están vinculando la misma versión de la biblioteca estándar. Lo más probable es que no lo sean, compruebe las propiedades-> generación de código-> enlace de biblioteca estándar.
Primero, libcmtd.lib es para una versión de depuración y libcmt.lib es para producción. Verifique nuevamente que no incluya ambos. Un lugar para verificar es la sección "Línea de comandos" de las propiedades de configuración / propiedades del proyecto del enlazador.
Si va a las propiedades del proyecto y abre la sección Propiedades de configuración / Enlazador / Entrada, puede "Biblioteca específica de Ingore" ... intente listar libcmtd.lib en ese campo.
Si el otro proyecto (biblioteca no estática) es un proyecto CRT, consulte este enlace:
Una cosa para intentar es asegurarte de que tienes:
#include "stdafx.h"
como la primera línea en tus archivos .cpp. Estoy seguro de que esa no es la respuesta en todos los casos, pero hizo desaparecer el mismo error en mi caso.
Error de tipografía. Una manera estúpida que tienes es que en lugar de incluir el encabezado, introduces el cpp. p.ej
#include <myclass.cpp> //should be #include <myClass.h>
También tuve un problema similar. El enlace proporcionado por Donnie explica el motivo. La solución fue mirar los mensajes de error y luego eliminar esas libs involucradas y agregar esas libs en el orden de las librerías MFC primero y luego las librerías CRT.
La forma de hacerlo en vs2008 es dada por Ali.
en la entrada del enlazador de configuración
- En dependencias adicionales ponga uafxcw.lib; LIBCMT.lib
- En Ignorar poner específico poner uafxcw.lib; LIBCMT.lib
Las bibliotecas CRT usan enlaces externos débiles para las funciones nuevas, eliminar y DllMain. Las bibliotecas MFC también contienen nuevas funciones, eliminar y DllMain. Estas funciones requieren que las bibliotecas MFC se vinculen antes de vincular la biblioteca CRT. http://support.microsoft.com/kb/148652
Solución basada en VS2005 (Reemplace Nafxcwd.lib con Uafxcwd.lib para ~ VS2013)
ir a proyecto> propiedades> propiedades de configuración> vinculador> entrada
agregar a "Dependencia adicional" -> Nafxcwd.lib Libcmtd.lib
agregar a "ignorar biblioteca específica" -> Nafxcwd.lib; Libcmtd.lib
el orden de las bibliotecas es importante (Nafxcwd.lib; Libcmtd.lib).
También agregaré que si ha reemplazado los operadores nuevos / eliminar (y si es el caso, haga la matriz y el escalar ambos), puede necesitar etiquetarlos como __forceinline para que el obj no colisione con la lib.
Por ejemplo, hice esto para forzar asignaciones alineadas y tuve el mismo problema hasta que lo hice:
__forceinline void * operator new(size_t size)
{
return _aligned_malloc(size, 16);
}
__forceinline void operator delete(void* ptr)
{
_aligned_free(ptr);
}
__forceinline void * operator new [](size_t size)
{
return _aligned_malloc(size, 16);
}
__forceinline void operator delete [](void* ptr)
{
_aligned_free(ptr);
}
Me deshice del problema
uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
- En dependencias adicionales, ponga
uafxcw.lib
. - En Ignorar poner específico poner
uafxcw.lib
.
asegúrese de tener #include <afx.h>
en "stdafx.h"
ANTES de que otro incluya #include <string>
Un archivo de encabezado declaró y definió una variable. Las posibles soluciones incluyen: Declarar la variable en .h: extern BOOL MyBool; y luego asignarlo en un archivo .c o .cpp: BOOL MyBool = FALSE ;. Declara la variable estática. Declara la variable selectany.
Para mí, el problema se resolvió cambiando
Proyecto -> Propiedades -> Propiedades de configuración -> General: uso de MFC = Usar MFC en una DLL compartida
Antes de configurarlo en "Usar bibliotecas estándar de Windows"
Además, tuve que configurar la opción / MD en
Proyecto -> Propiedades -> C / C ++ -> Generación de código: Runtime Library = DLL de subprocesos múltiples (/ MD)