2009-04-14 10 views
5

Estoy usando Visual C++ 2008, SP1. Tengo una aplicación QT (gui, .exe) en la configuración de compilación de depuración. Está configurado para usar la versión DLL de depuración de subprocesos múltiples del CRT, también conocido como MSVCRTD.lib.¿Cómo se construye un .exe de depuración (MSVCRTD.lib) contra una versión lib liberada (MSVCRT.lib)?

Estoy vinculando contra una biblioteca de terceros que está construida en modo de lanzamiento y utilizando la versión de DLL multiproceso (sin depuración) de la CRT, también conocida como MSVCRT.lib.

Se vincula y se ejecuta, pero se bloquea al inicio. Mientras enlazo recibo la advertencia:

LINK: advertencia LNK4098: defaultlib 'MSVCRT' entra en conflicto con el uso de otras librerías; uso/NODEFAULTLIB: Biblioteca

Intenté fijar /NODEFAULTLIB:msvcrt.lib

pero que dio lugar a 5 que une los errores debidos a los símbolos que faltan.

Entonces, ¿no es posible utilizar dos bibliotecas diferentes? ¿Cuál es la alternativa? ¿Puedo crear una DLL de la biblioteca de terceros que tengo? ¿O es algo que la tercera parte tendría que hacer?

La excepción es en el arranque:

"excepción no controlada en ....... en MyApp.exe: ...... Acceso violación lugar de leer 0x00000000f"

La siguiente es la pila de llamadas después de la aplicación se ejecuta y se bloquea:

MyApp.exe!std::_Aux_cont::_Getcont() + 0xa bytes C++ 
MyApp.exe!std::_Iterator_base_aux::_Getmycont() + 0x1b bytes C++ 
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::const_iterator::operator*() + 0x28 bytes C++ 
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::iterator::operator*() + 0xf bytes C++ 
MyApp.exe!std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> > >::operator[]() + 0xe9 bytes C++ 
MyApp.exe!ThirdPartyLib::client::`anonymous namespace'::init_xlt_mode() + 0x5f bytes C++ 
[email protected]() + 0x8d8f3 bytes C++ 
msvcr90d.dll!_initterm(void (void)* * pfbegin=0x006c4468, void (void)* * pfend=0x006cb0b8) Line 903 C 
MyApp.exe!__tmainCRTStartup() Line 501 + 0xf bytes C 
MyApp.exe!WinMainCRTStartup() Line 403 C 
kernel32.dll!7c817067()  
+0

¿Qué errores estás obteniendo en el arranque? – LeopardSkinPillBoxHat

+0

Hola, acabo de actualizar la publicación original anterior con más detalles y una respuesta a su pregunta. – ApplePieIsGood

Respuesta

10

Puede construir su proyecto para vincularlo con la versión CRT y habilitar la información de depuración para su código. En "Propiedades del proyecto" vaya a C++/General y cambie el Formato de información de depuración. En la sección "Optimización", desactive la optimización. Cambie a la sección "Enlazador/Depuración" y habilite la generación de información de depuración. Asegúrese de establecer el archivo de base de datos del programa (PDB).

En este punto, su aplicación emitirá información de depuración para todo lo que se encuentre en su código y lo vinculará con el DLL CRT sin depuración. Esto le permite depurar su aplicación en una configuración de versión mientras evita los problemas asociados con el uso de múltiples CRT en la misma aplicación.

+1

¡Bingo, esto es un salvavidas! Estoy tratando de marcar esta respuesta como la solución, pero no me está dejando por alguna razón. ¡Muchas gracias! – ApplePieIsGood

+0

Eso es mejor. – ApplePieIsGood

2

he visto problemas similares a esto cuando mezcla y combinación de depuración y liberación de las bibliotecas de configuración.

Si bien esto a veces puede funcionar, también puede dar lugar a bloqueos oscuros como el que está viendo (posiblemente causado por puntos de entrada no coincidentes o algo similar).

Las alternativas como las veo son:

  • generar la aplicación de configuración Release (apuntando a msvcrt.dll) y ver si esto funciona (que no será capaz de obtener la mayor cantidad de depuración información, pero podría ayudar a aislar el origen del problema).

  • Si la biblioteca de terceros es de código abierto, intente construir usted mismo la versión de depuración del archivo .lib.

  • De lo contrario, vea si la versión de depuración está disponible en línea o póngase en contacto con el proveedor.

Lo siento, no podría ser de más ayuda. Creo que será más rápido a largo plazo si puede obtener acceso a las bibliotecas correctas y luego tratar de encontrar formas de evitarlo.

+0

Debería haber dicho, funciona bien cuando construyo mi aplicación en modo Release, pero como dices, no puedo depurarlo por nada que yo sepa, lo que hace que las cosas no tengan sentido. Le pregunté al proveedor y al principio no parecían pensar que pudieran ofrecer una versión de depuración. Estoy tratando de convencerlos. – ApplePieIsGood

Cuestiones relacionadas