Как создать отладочную версию .exe (MSVCRTD.lib) для библиотеки, выпущенной на основе релиза (MSVCRT.lib)? - PullRequest
5 голосов
/ 14 апреля 2009

Я использую Visual C ++ 2008, SP1. У меня есть приложение QT (gui, .exe) в конфигурации отладочной сборки. Он настроен на использование многопоточной отладочной DLL-версии CRT, также известной как MSVCRTD.lib.

Я ссылаюсь на стороннюю библиотеку, которая встроена в режим выпуска и использую многопоточную DLL-версию (не отладочную) CRT, также известную как MSVCRT.lib.

Связывает и запускает, но вылетает при запуске. При связывании получаю предупреждение:

ССЫЛКА: предупреждение LNK4098: defaultlib 'MSVCRT' конфликтует с использованием других библиотек; использовать / NODEFAULTLIB: библиотека

Я попытался установить /NODEFAULTLIB:msvcrt.lib

но это привело к 5 ошибкам связывания из-за пропущенных символов.

Так нельзя ли использовать две разные библиотеки? Какая альтернатива? Могу ли я создать DLL из сторонней библиотеки? Или это что-то, что должна сделать третья сторона?

Исключение при запуске:

"Необработанное исключение при ....... в MyApp.exe: ...... Место чтения нарушения доступа 0x00000000f "

Ниже приведен стек вызовов после запуска приложения и его сбоя:

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++
MyApp.exe!_GetCommandLineW@0()  + 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()     

Ответы [ 2 ]

10 голосов
/ 14 апреля 2009

Вы можете создать свой проект для связи с версией CRT и включить отладочную информацию для вашего кода. В «Свойствах проекта» перейдите на C ++ / General и измените формат информации отладки. В разделе «Оптимизация» отключите оптимизацию. Перейдите в раздел «Linker / Debugging» и включите генерацию отладочной информации. Обязательно установите файл базы данных программы (PDB).

На этом этапе ваше приложение будет выдавать отладочную информацию для всего, что есть в вашем коде, и связываться с неотладочной DLL CRT. Это позволяет отлаживать приложение в конфигурации выпуска, избегая проблем, связанных с использованием нескольких CRT в одном приложении.

2 голосов
/ 14 апреля 2009

Я сталкивался с подобными проблемами при смешивании и подборе библиотек конфигурации Debug и Release.

Хотя иногда это может работать, это может также привести к неясным сбоям, таким как тот, который вы видите (возможно, вызванный несовпадающими точками входа или чем-то подобным).

Альтернативы, как я их вижу:

  • Создайте свое приложение в конфигурации выпуска (указывая на MSVCRT.dll) и посмотрите, работает ли это (вы не сможете получить столько отладочной информации, но это может помочь изолировать источник проблемы) .

  • Если сторонняя библиотека с открытым исходным кодом, попробуйте собрать версию отладочного файла .lib самостоятельно.

  • В противном случае проверьте, доступна ли версия отладки в Интернете, или обратитесь к поставщику.

Извините, я не мог больше помочь. Я думаю, что в конечном итоге будет быстрее, если вы сможете получить доступ к нужным библиотекам, а затем попытаться найти способы обойти это.

...