Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Visual C++/MFC/WTL > MS CRT-шный версионный ад |
Автор: jonie 22.7.2010, 12:38 | ||||
Итак, имеем следующую известную проблему: проблему версий CRT Runtime (рассматриваем vs2008) * *) для тех кто незнает что это такое: версий баблиотек msvcr90.dll не одна и не две, они лежат в windows\WinSxS папке, и винда грузит нужную версию на основании манифеста, указанного в длл-ке либо в app.exe.config файле Пути ее решения следующие: 1) Поправить в app.exe.config файле, указав конкретный редирект. Например так:
2) найти нужный KB с нужными версиями (вопрос: где взять список того что скачать для конкретной версии CRT?) - поверьте это не такая и простая задача 3) деплоить приложение методом x-copy, беря длл-ки из вашей системы конкретных версий 4) установить
5) метод "прилинковать статически к CRT" не рассматриваем, ибо мы не любим простые решения, да и есть с ним большие проблемы... Вопрос: какой метод вы предпочитаете? UPD: для версии 9.0.30729.4148 вот ссылка http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=2051a0c1-c9b5-4b0a-a8f5-770a549fd78c, KB973552 |
Автор: Abyx 22.7.2010, 14:50 |
линкуем статически. все довольны. |
Автор: borisbn 22.7.2010, 18:09 |
Я упаковываю в инсталлятор vcredist_x86.exe и запускаю его из своего инсталлятора IMHO проще некуда |
Автор: jonie 22.7.2010, 22:33 |
borisbn, прочтите внимательно: версий vcredist не одна и не две. Я вот сегодня буквально попал на интересный баг - у меня было две длл, собранные в двух версиях CRT... передал я значится std::string* .... которую создал в одном CRT, а убил в другом... получил "по ушам" минут через 5 работы программы.... Конечно, следить никто не отменял...но часто собрать одному разработчику всё нереально, а билд конвееры могут быть настроены черти-как ..... Abyx, попробуйте сделать с 50 DLL и попередавать std-шные объекты и указатели на них между DLL - будет весело (а еще поиграйтесь в нескольких проектах настройками компилятора и линковщика)..... в общем это не спасение, более того, например отладка утечек памяти в подобных длл весьма и весьма нетривиальна (переопределите new и delete для отладки например)..... |
Автор: jonie 23.7.2010, 08:34 |
borisbn, ок. Давайте посмотрим на реализацию log4cxx от апача.. да примером может быть много. Передавать можно, вполне себе, если настройки компиляции и CRT одна и таже. Конкретно в моем случае CRT была тожа одна (9-ая), но разных версий. |
Автор: maxim1000 23.7.2010, 08:39 |
"CRT одна и та же" не то же самое, что одной и той же версии сам экземпляр должен быть один если приложение состоит из нескольких модулей, и память, выделенная в одном модуле, освобождается в другом, нужно использовать CRT в виде DLL ну и, естественно, таскать его с собой в инсталляторе |
Автор: jonie 23.7.2010, 09:18 |
кстати, кому интересно, стоит почитать про winSxS папку тут http://msdn.microsoft.com/en-us/library/aa376307%28VS.85%29.aspx (раздел "Side-by-side Assemblies" и далее).... maxim1000 ну да, я немного не так сказал - у меня получилось загрузить два инстанса crt9 и произошел сбой. |
Автор: borisbn 23.7.2010, 10:58 |
jonie, у нас несколько довольно крупных проектов. Так уж получилось, что одни части сделаны на Builder'е 5.0, другие - на MSVC 2005, другие - на MSVC 2008. У нас принято жёсткие правила: 1. Передавать из exe в dll и обратно только простые типы. Никаких stl, vcl, qt-объектов. 2. Всегда явно в коде указывать выравнивание ( #pragma pack( push, 4 ) ) и calling conventions функций ( __stdcall или __cdecl ) 3. Удаляет память ( объекты ) тот, кто создал И проблем с CRT никаких не было. |
Автор: Dem_max 23.7.2010, 11:47 |
borisbn правильный подход |
Автор: Abyx 23.7.2010, 11:56 |
а еще можно бросить этот ####й C++ и писать на C# |
Автор: Dem_max 23.7.2010, 12:00 |
ага и в дистрибутив включать .NET Framework |
Автор: jonie 23.7.2010, 12:48 |
borisbn, в указанных тобой случаях это да, необходимо. Но зачастую есть исключения - это не хорошо и не плохо - это нормально. |
Автор: VSB 7.8.2010, 17:57 |
Dem_max, 2010 год уже к концу идет, пора бросить XP а в висте и 7 уже есть .NET из коробки (правда в 7 только до 3,5 версии). |
Автор: Dem_max 7.8.2010, 18:40 | ||
Это не правильный подход. Eсли что напомню, на сей момент до сих пор работают программы под MS-DOS, собственно говоря WinXP еще долго будет на плаву. |
Автор: Alca 7.8.2010, 18:40 | ||
и кодить тока под винду |
Автор: Abyx 7.8.2010, 22:49 |
Alca, а могут быть проблемы с MS CRT под никсами?) |