Russian Qt Forum
Ноябрь 24, 2024, 22:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: VC90.CRT зависимость  (Прочитано 41533 раз)
Flakes
Гость
« : Май 21, 2008, 06:08 »

При переносе программки на "чистую" машину, ругается на отсутствие msvcr90.dll. Пытался слинковать с msvcrt.lib, безрезультатно. Пришлось эти куски выдрать из ..\Windows\WinSxS на новую машину.

Как все таки вогнать все это в ехе-шник?
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #1 : Май 21, 2008, 13:29 »

С программой ставить это.
Записан
IMPOMEZIA
Гость
« Ответ #2 : Май 21, 2008, 13:37 »

Либо таскать с собой папочку Microsoft.VC90.CRT
из Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\
как и Microsoft Visual C++ 2008 Redistributable Package это не вгонит всё это в exe-шник, но удовлетворит зависимости.
Записан
Flakes
Гость
« Ответ #3 : Май 21, 2008, 15:30 »

Спасибо!

Все слишком весомое, я лучше буду таскать пару файликов из ..\Windows\WinSxS\
Записан
Flakes
Гость
« Ответ #4 : Май 23, 2008, 01:29 »

если я просто перенес проект в VS2008 из VS2005, это уже и объясняет эту зависимость или я может галочку где забыл снять?
Записан
Godfather
Гость
« Ответ #5 : Июнь 03, 2008, 12:43 »

компиляция с Multi-threaded DLL (/MD) под 2005 создает зависимость от MSVCRT80.dll (т.е. Microsoft Visual C++ Runtime 8.0)
под 2008 - с MSVCRT90.dll

компиляция с Multi-threaded (/MT) такой зависимости не создает

но она присутствует от самой Qt (как скомпилировать без зависимости - большой для меня вопрос)
Записан
Godfather
Гость
« Ответ #6 : Июнь 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

ура! Улыбающийся
Записан
crossly
Гость
« Ответ #7 : Июнь 17, 2008, 11:59 »

Цитировать
но она присутствует от самой Qt (как скомпилировать без зависимости - большой для меня вопрос)
а что если подправить в qmake.conf....
Код:
QMAKE_CFLAGS_RELEASE	= -O2 -MD
QMAKE_CFLAGS_DEBUG = -Zi -MDd
Записан
Flakes
Гость
« Ответ #8 : Сентябрь 22, 2008, 15:36 »

С этим .manifest файлом (как пример) и dll-ками которые в нем указаны - проекты, собранные в VS2008 работают на абсолютно голой системе, никаких Microsoft Visual C++ 2008 Redistributable Package. Я уверен об этом знали многие гуру, но никто не упомянул Улыбающийся
Записан
IMPOMEZIA
Гость
« Ответ #9 : Сентябрь 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 с опциями по умолчанию вас ждёт облом с плагинами.
Записан
Flakes
Гость
« Ответ #10 : Сентябрь 22, 2008, 17:52 »

Не, я выдрал его из другого места, но в третьем посте вы были правы тоже.

Я разобрался на половину с плагинами, как описано тут. Нужно их класть рядом, папочками.

Цитировать
в Qt 4.4.2 с опциями по умолчанию вас ждёт облом с плагинами.

А как быть? Манифест  полностью для плагинов не спасает, необходимо Redistributable Package доустанавливать.
« Последнее редактирование: Сентябрь 22, 2008, 18:41 от Flakes » Записан
SubV
Гость
« Ответ #11 : Ноябрь 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...

Удачи.
« Последнее редактирование: Ноябрь 17, 2008, 18:07 от SubV » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Ноябрь 17, 2008, 18:07 »

А разве можно, с лицензионной точки зрения, изменять системные файлы?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
SubV
Гость
« Ответ #13 : Ноябрь 17, 2008, 18:11 »

А разве можно, с лицензионной точки зрения, изменять системные файлы?

С "лицензионной точки зрения" вообще лучше всего к компьютеру не прикасаться, и при возникновении малейшей проблемы звонить в техсаппорт M$.

Впрочем, это тема для другого топика...
Записан
IMPOMEZIA
Гость
« Ответ #14 : Ноябрь 17, 2008, 18:53 »

Цитата: Flakes
А как быть? Манифест  полностью для плагинов не спасает, необходимо Redistributable Package доустанавливать.
configure.exe -no-plugin-manifests
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.336 секунд. Запросов: 23.