Название: VC90.CRT зависимость Отправлено: Flakes от Май 21, 2008, 06:08 При переносе программки на "чистую" машину, ругается на отсутствие msvcr90.dll. Пытался слинковать с msvcrt.lib, безрезультатно. Пришлось эти куски выдрать из ..\Windows\WinSxS на новую машину.
Как все таки вогнать все это в ехе-шник? Название: Re: VC90.CRT зависимость Отправлено: Sergey B. от Май 21, 2008, 13:29 С программой ставить это. (http://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF&displaylang=en)
Название: Re: VC90.CRT зависимость Отправлено: IMPOMEZIA от Май 21, 2008, 13:37 Либо таскать с собой папочку Microsoft.VC90.CRT
из Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\ как и Microsoft Visual C++ 2008 Redistributable Package это не вгонит всё это в exe-шник, но удовлетворит зависимости. Название: Re: VC90.CRT зависимость Отправлено: Flakes от Май 21, 2008, 15:30 Спасибо!
Все слишком весомое, я лучше буду таскать пару файликов из ..\Windows\WinSxS\ Название: Re: VC90.CRT зависимость Отправлено: Flakes от Май 23, 2008, 01:29 если я просто перенес проект в VS2008 из VS2005, это уже и объясняет эту зависимость или я может галочку где забыл снять?
Название: Re: VC90.CRT зависимость Отправлено: Godfather от Июнь 03, 2008, 12:43 компиляция с Multi-threaded DLL (/MD) под 2005 создает зависимость от MSVCRT80.dll (т.е. Microsoft Visual C++ Runtime 8.0)
под 2008 - с MSVCRT90.dll компиляция с Multi-threaded (/MT) такой зависимости не создает но она присутствует от самой Qt (как скомпилировать без зависимости - большой для меня вопрос) Название: Re: VC90.CRT зависимость Отправлено: Godfather от Июнь 04, 2008, 14:41 итак
Qt 4.4 легко и непренужденно компилируется с 9.0 (qmakespec win32-msvc2008) configure.exe из Qt 4.3.x не понимает такого спека, даже если скопировать %QTDIR%\mkspecs\win32-msvc2008 но самая полная перекомпиляция (типа delete bin\*.* && make clean && make) избавляет от следов 8.0 ура! :) Название: Re: VC90.CRT зависимость Отправлено: crossly от Июнь 17, 2008, 11:59 Цитировать но она присутствует от самой Qt (как скомпилировать без зависимости - большой для меня вопрос) а что если подправить в qmake.conf....Код: QMAKE_CFLAGS_RELEASE = -O2 -MD Название: Re: VC90.CRT зависимость Отправлено: Flakes от Сентябрь 22, 2008, 15:36 С этим .manifest файлом (как пример) и dll-ками которые в нем указаны - проекты, собранные в VS2008 работают на абсолютно голой системе, никаких Microsoft Visual C++ 2008 Redistributable Package. Я уверен об этом знали многие гуру, но никто не упомянул :)
Название: Re: VC90.CRT зависимость Отправлено: IMPOMEZIA от Сентябрь 22, 2008, 17:09 Flakes
А сам манифест вы взяли из: <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC90.CRT как было сказано мною в третьем посте. Об этом также сказано в ассистенте. + msvcm90.dll не нужен. + msvcp90.dll не нужен при -no-stl + в Qt 4.4.2 с опциями по умолчанию вас ждёт облом с плагинами. Название: Re: VC90.CRT зависимость Отправлено: Flakes от Сентябрь 22, 2008, 17:52 Не, я выдрал его из другого места, но в третьем посте вы были правы тоже.
Я разобрался на половину с плагинами, как описано тут (http://doc.trolltech.com/4.4/plugins-howto.html). Нужно их класть рядом, папочками. Цитировать в Qt 4.4.2 с опциями по умолчанию вас ждёт облом с плагинами. А как быть? Манифест полностью для плагинов не спасает, необходимо Redistributable Package доустанавливать. Название: Re: VC90.CRT зависимость Отправлено: SubV от Ноябрь 17, 2008, 16:19 Подмена манифеста - неполное решение проблемы.
К счастью, решение есть. Необходимо пропатчить библиотеку msvcr90.dll, прописав mov eax,1 / ret по адресу 0x21BE0. ( По этому адресу располагается начало функции _check_manifest, от которой, собственно - всё зло ;) ). В общем, для msvcr90.dll прописываем hex-редактором комбинацию байт B8 01 00 00 00 C3 по адресу 0x21BE0 (для msvcr80.dll соответствующим адресом будет 0x1D76). Компилим проект без манифеста, бросаем dll'ки в папку с программой... всё, как в старые, добрые времена. Запускаем программу, всё работает без manifest hell и vc redist'ов. edit: Проверено на билдах 8.0.50727.3053, 9.0.21022.8, 9.0.30729.1. Адрес _check_manifest не меняется в пределах одной версии vc++ runtime. Если он изменится в будущих билдах, не составит никаких трудов его найти. Находим первый вызов GetSystemDirectoryW, затем поднимаемся немного выше до начала функции (mov edi,edi / push ebp). Само собой, для использования исправленной crt в Qt-приложениях придётся перекомпилировать Qt, прописав в файле mkspecs\win32-msvc2008\qmake.conf в строке QMAKE_LFLAGS дополнительный ключ /MANIFEST:NO. Последнее сам ещё не пробовал, но скорее всего - прокатит. Отпишитесь о результатах, pls... Удачи. Название: Re: VC90.CRT зависимость Отправлено: Пантер от Ноябрь 17, 2008, 18:07 А разве можно, с лицензионной точки зрения, изменять системные файлы?
Название: Re: VC90.CRT зависимость Отправлено: SubV от Ноябрь 17, 2008, 18:11 А разве можно, с лицензионной точки зрения, изменять системные файлы? С "лицензионной точки зрения" вообще лучше всего к компьютеру не прикасаться, и при возникновении малейшей проблемы звонить в техсаппорт M$. Впрочем, это тема для другого топика... Название: Re: VC90.CRT зависимость Отправлено: IMPOMEZIA от Ноябрь 17, 2008, 18:53 Цитата: Flakes А как быть? Манифест полностью для плагинов не спасает, необходимо Redistributable Package доустанавливать. configure.exe -no-plugin-manifestsНазвание: Re: VC90.CRT зависимость Отправлено: SubV от Ноябрь 17, 2008, 19:22 Кстати.
Поискать решение проблемы WinSxS и "Manifest Hell" меня заставил дистрибутив бесплатной программы FictionBook Editor, поставляющейся с msvcr90.dll в папке с приложением, но без vc++ redist. Со временем, надеюсь, в M$ откажутся от WinSxS (хотя бы частично) - ибо идея была крайне неудачной и породила больше проблем, чем решила. WinSxS хорош для системных компонент и приложений, плотно интегрированных в ОС (IE, Office, Visual Studio etc) - но не для приложений пользователя. "DLL hell" же - давно в прошлом, с тех пор, как правилом хорошего тона стало поставлять все необходимые библиотеки в одной папке с программой. edit: Пересобрал Qt 4.4.3 следующим образом: - удалил всё содержимое из файлов embed_manifest_dll.prf и embed_manifest_exe.prf (они лежат в Qt\4.4.3\mkspecs\features\win32\); - в qmake.conf прописал QMAKE_LFLAGS = /NOLOGO /MANIFEST:NO (файл находится в директории Qt\4.4.3\mkspecs\win32-msvc2008\); - запустил configure / nmake. Сделал пробный Qt-проект из одного диалога, в настройках указал Generate Manifest: No и Embed Manifest: No. В папку с скомпилированным exe-файлом положил QtCore4.dll, QtGui4.dll, msvcp90.dll и пропатченный msvcr90.dll. Всё работает без установки VC++ Redist - проверено на чистой WinXP SP3. Название: Re: VC90.CRT зависимость Отправлено: BaltikS от Ноябрь 19, 2008, 09:00 Как писал crossly, Надо исправить с MD на MT в нужном файле и configure / nmake, проверено мной на 4.4.3 вообще кроме QtCore и QtGui ничего не требует, даже msvcr80.dll (для VC 2005), проверено на голой XP SP2 и SP3. Но не пашут только плагины в 98... А так все зависимости удовлетворены!
Название: Re: VC90.CRT зависимость Отправлено: mks56 от Ноябрь 20, 2008, 11:45 Полное решение проблемы: сборка полностью статической библиотеки qt без зависимостей от run-time С и C++. Размер exe-шника при это минимум 5-6Мб
Название: Re: VC90.CRT зависимость Отправлено: BaltikS от Ноябрь 20, 2008, 13:00 Это не решение проблемы! Если я использую плагины, данное решение абсолютно не приемлемо!
Название: Re: VC90.CRT зависимость Отправлено: Detonator от Ноябрь 20, 2008, 21:53 если ты оспользуешь фиксированый набор плагинов - скомпили их со статикой. Если динамически подгружаешь свои плагины тогда другое дело.
Я к примеру все плагины к програме делаю на скриптах, и статику можно использовать, и расширяемость большая, и пользователям свои плагины делать проще. Название: Re: VC90.CRT зависимость Отправлено: Примерный ученик от Ноябрь 20, 2008, 22:52 Не так страшен манифест, как кажется.
Ну болтается возле бинарника ~2 Мб DLL... QT DLL - ~ 5Мб. И все ОК ;D Название: Re: VC90.CRT зависимость Отправлено: Flakes от Сентябрь 06, 2009, 22:12 Сори, что поднимаю старую тему...
Цитировать но она присутствует от самой Qt (как скомпилировать без зависимости - большой для меня вопрос) а что если подправить в qmake.conf....Код: QMAKE_CFLAGS_RELEASE = -O2 -MD Я залез в соответствующий qmake.conf, поправил на MT, а толку никакого. Так же в проекте в VS поставил C++ -> Code Generation -> Runtime Library -> /MT и Linker -> Input -> Ignore Specific Library -> msvcrt. Мой проект компилится, но если пытаюсь запустить на какой нить Win2K - оно просит MSVCP90.dll. Или мне надо весь Qt пересобирать из-за этого (и еще надеюсь не static)? Название: Re: VC90.CRT зависимость Отправлено: shadone от Сентябрь 09, 2009, 14:44 Сори, что поднимаю старую тему... опция -MT говорит собирать с static runtime library. Qt не поддерживает эту опцию. (я бы даже сказал - Qt собранная с этой опцией гарантированно работать не будет).Цитировать но она присутствует от самой Qt (как скомпилировать без зависимости - большой для меня вопрос) а что если подправить в qmake.conf....Код: QMAKE_CFLAGS_RELEASE = -O2 -MD Я залез в соответствующий qmake.conf, поправил на MT, а толку никакого. Так же в проекте в VS поставил C++ -> Code Generation -> Runtime Library -> /MT и Linker -> Input -> Ignore Specific Library -> msvcrt. Мой проект компилится, но если пытаюсь запустить на какой нить Win2K - оно просит MSVCP90.dll. Или мне надо весь Qt пересобирать из-за этого (и еще надеюсь не static)? по сути изначального вопрос я бы посоветовал разобраться с манифестами и устанавливать c++ runtime redistributable модули. У распространении msvcr90.dll вместе с приложением в каталоге с бинарником есть огромнейший минус - динамический линкер подгрузит ее в память повторно. Название: Re: VC90.CRT зависимость Отправлено: Flakes от Октябрь 20, 2009, 01:16 Смог разобраться. Скомпилил Qt c /MT и все хорошо линкуется статически вместе сплагинами, никаких левых библиотек и файлов, один екзещник, который работает даже на win2000.
Название: Re: VC90.CRT зависимость Отправлено: Naihil от Сентябрь 07, 2010, 09:40 Здравствуйте, люди добрые! Прошу прощения за поднятие старой темы.
Возникла необходимость в сборке проекта в VS2008 и появилось несколько вопросов с манифестами и зависимостями. 1. Стоит VS2008 Express SP1. Создаю обычное win32 приложение. Студия создаёт следующий манифест: Код: <?xml version='1.0' encoding='UTF-8' standalone='yes'?> Dependency Walker при профайле загружает "c:\windows\winsxs\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_x-ww_d495ac4e\MSVCR90.DLL" Скопировал <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC90.CRT в папку с этим приложением и попробовал запустить на чистой системе. Получил ошибку - приложение неправильно сконфигурировано. Почему манифест создаётся с более старой версией библиотек, а не с версией VS2008? 2. Создаю простое Qt приложение. При компиляции создаётся такой манифест: Код: <?xml version='1.0' encoding='UTF-8' standalone='yes'?> Знаю, что рекомендуется ставить C++ redist, но хотелось бы разобраться с этим способом. Название: Re: VC90.CRT зависимость Отправлено: Naihil от Сентябрь 07, 2010, 14:57 Порывшись в интернетах, выяснил, что для сборки с текущей версией рантайм библиотек в VS2008SP1 необходимо задать директиву
#define _BIND_TO_CURRENT_VCLIBS_VERSION 1 в каждом проекте. Вопрос с COMCTL32.DLL пока остаётся открытым |