Не удается разрешить сборку VC90.DebugCRT?

Доброго времени суток!
Дано: проект написанный в Visual Studio 2008 с использованием QT 4 пытаюсь перенести в Visual Studio 2012 с использованием того же QT4. Собираю в конфигурации Debug и при запуске приложения получаю:
Activation context generation failed for "....". Dependent Assembly Microsoft.VC90.DebugCRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" could not be found. Please use sxstrace.exe for detailed diagnosis.

Понимаю что проблема с VCRedist, ставлю нужную версию, перезагружаюсь, получаю тоже самое. Меняю конфигурацию с Debug на Release, собираю проект, смотрю манифест, а там опять этот злополучный Microsoft.VC90.DebugCRT. Удаляю приставку Debug и о чудо, приложение запускается и работает. Но что же делать с отладкой? Пробовал подсовывать в папку с исполняемым файлом, файлы из папки VC90.DebugCRT- но в результате исполняемый файл находит то, что ему нужно, но начинают ругаться QT'шные библиотеки, тк теперь они не могу найти VC90.DebugCRT. Еще пытался в настройках проекта прописать зависимости и указывал пути в всевозможных местах к требуемой сборке. Насколько я понимаю, так как используется 12 студия, то и Redist она использует соответствующей версии. Как все наладить? Куда смотреть?
Спасибо за внимание!
  • Вопрос задан
  • 1017 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C++
Значит так, во-первых вам для Qt и для вашего приложения нужно использовать один тулчейн (компилятор), иначе будет огромное количество странных проблем. Т.к. вы разрабатываете в 2012-й студии, а, к сожалению, официально 4-й кьют под эту студию не собирался, вам придется как минимум поставить компилятор из 2010-й студии (не помню, возможно 2012-ю можно таргетировать на старый компилятор, чтобы не ставить 2010-ю студию целиком). Можно и попробовать собрать из исходников, но я не могу назвать это простым делом.
Во-вторых, если мы представим, что вы выполнили предыдущий этап, и у вас есть собранный Qt и компилятор той же версии, то в зависимости от конфигурации (Debug|Release) ваша программа будет линковаться на разные рантаймы. DLL-файлы рантайма имеют букву 'd' в конце имени файла. Для разных версий VC++ они называются по разному:
msvcr90[d].dll+msvcp90[d].dll - Visual Studio 2008 (MSVC 9.0)
msvcr100[d].dll+msvcp100[d].dll - Visual Studio 2010 (MSVC 10.0)
msvcr110[d].dll+msvcp110[d].dll - Visual Studio 2012 (MSVC 11.0)
msvcr120[d].dll+msvcp120[d].dll - Visual Studio 2013 (MSVC 12.0)
Для чего я это привел - т.к. ваша ошибка прилетела скорее всего из подсистемы side-by-side, и связана с конфликтом версий библиотек, в качестве workaround советую вам найти дебаг-библиотеки там где у вас установлена студия, и скопировать из к exe-шнику вашего приложения, чтобы эти библиотеки подхватывались приоритетнее. Однако перед тем, как вы это сделаете, попробуйте следующее:
0) разберитесь с версией компилятора, под которую собирался Qt. Возможно лучшее решение - таки поставить компилятор из 2010-й, не решив этот вопрос продолжать нормально работать невозможно
1) убедитесь, что пересобрали проект (сделайте Rebuild All)
2) поставьте апдейты на 2012-ю студию, если она не последней версии
Если проблема останется, возьмите Dependecy Walker, натравите на Exe-шник, и проверьте, откуда он подтягивает debug-библиотеки.
Если есть вопросы - в комментарии.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы