tag - Errores de enlace de Visual Studio. ¿Orden en que MFC, CRT incluido?
visual studio code go to definition php (2)
El problema es claro: está compilando códigos CRT y MFC juntos.
Cuando utilice las bibliotecas MFC, debe asegurarse de que estén vinculadas antes de vincular la biblioteca CRT. Puede hacerlo asegurándose de que cada archivo de su proyecto incluya Msdev / Mfc / Include / Afx.h primero, ya sea directamente (#include) o indirectamente (#include). El archivo de inclusión Afx.h obliga al orden correcto de las bibliotecas, mediante el uso de la directiva:
#pragma comment (lib,"<libname>")
Microsoft tiene un artículo que describe este problema y sugiere 2 soluciones (paso a paso):
- Solución 1: Forzar al enlazador a vincular las bibliotecas en orden correcto
- Solución dos: localizar y corregir el módulo de problema
Esta pregunta se ha planteado en numerosas ocasiones, pero Visual Studio nunca deja de desafiarme.
Tenemos una aplicación que debería ser autosuficiente, es decir, no depender de ninguna biblioteca de terceros. Esta es la razón por la cual construimos todo estáticamente usando los indicadores de generación de código MT(d)
.
La aplicación depende de Qt
, zlib
, OpenSSL
y DCMTK
. Todas estas bibliotecas se construyeron como bibliotecas estáticas con MT(d)
. La aplicación también utiliza algún código relacionado con MFC
, por lo que también debemos vincularlo.
MFC está incluido a través de
#include <afxwin.h>
Leí en alguna parte que este debería ser el primero incluido en cada archivo, pero no estoy seguro de si es cierto. De todos modos, la línea no está incluida en cada archivo, solo un archivo lo incluye.
Aquí están los errores relacionados con el enlace:
Error 24 error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj) uafxcwd.lib
Error 22 error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) uafxcwd.lib
Error 23 error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj) uafxcwd.lib
Error 21 error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj) uafxcwd.lib
Aquí está la salida del enlazador .
Leí muchos hilos en muchos sitios y en este artículo de KB de MSDN. Pero no me ayudan, ya que todos siguen diciendo que las librerías de MFC deberían estar vinculadas antes de CRT, pero no puedo encontrar una manera de alterar el orden de enlace.
Cualquier ayuda es muy apreciada.
Edición 1 : Usar el truco de este hilo en realidad resuelve el problema, pero aún quiero saber qué está mal aquí.
Edición 2 : Uso de Visual Studio 2008 SP1, en Windows 7 y Qt 4.6.3
Esto se me aclaró en los foros de MSDN: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/4e331cb3-e566-4ca6-b7d4-118c3bebd31a