Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MS CRT-шный версионный ад, а как справляетесь ВЫ? 
:(
    Опции темы
jonie
Дата 22.7.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Итак, имеем следующую известную проблему: проблему версий CRT Runtime (рассматриваем vs2008) *

*) для тех кто незнает что это такое: версий баблиотек msvcr90.dll не одна и не две, они лежат в windows\WinSxS папке, и винда грузит нужную версию на основании манифеста, указанного в длл-ке либо в app.exe.config файле

Пути ее решения следующие:
1) Поправить в app.exe.config файле, указав конкретный редирект. Например так:
Код

<configuration>

       <windows>

              <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

      <dependentAssembly>

        <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

        <bindingRedirect oldVersion="8.0.41204.256-8.0.50727.762" newVersion="8.0.50727.762"/>

      </dependentAssembly>

    </assemblyBinding>

       </windows>

</configuration>
(с) http://blogs.msdn.com/b/nikolad/archive/20...ifest-file.aspx

2) найти нужный KB с нужными версиями (вопрос: где взять список того что скачать для конкретной версии CRT?) - поверьте это не такая и простая задача

3) деплоить приложение методом x-copy, беря длл-ки из вашей системы конкретных версий

4) установить 
Код

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1 
в приложении (подробнее: http://msdn.microsoft.com/en-us/library/cc...8VS.90%29.aspx) и брать длл-ки из папки Microsoft Visual Studio 9.0\VC\redist\ и опять же деплоить его методом x-copy либо искать KB (вопрос: я не смог найти KB для версии 9.0.30729.4148 , хотя указаное тут http://support.microsoft.com/kb/973552 поставил, там ссылка на бюллетень безопасности)

5) метод "прилинковать статически к CRT" не рассматриваем, ибо мы не любим простые решения, да и есть с ним большие проблемы...

Вопрос: какой метод вы предпочитаете?

UPD: для версии 9.0.30729.4148 вот ссылка http://www.microsoft.com/downloads/details...f5-770a549fd78c, KB973552

Это сообщение отредактировал(а) jonie - 22.7.2010, 12:47


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Abyx
Дата 22.7.2010, 14:50 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: нет
Всего: 10



линкуем статически. все довольны.
PM MAIL   Вверх
borisbn
Дата 22.7.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 2
Всего: 135



Я упаковываю в инсталлятор vcredist_x86.exe и запускаю его из своего инсталлятора
IMHO проще некуда


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
jonie
Дата 22.7.2010, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



borisbn, прочтите внимательно: версий vcredist не одна и не две. Я вот сегодня буквально попал на интересный баг - у меня было две длл, собранные  в двух версиях CRT... передал я значится std::string* .... которую создал в одном CRT, а убил в другом... получил "по ушам" минут через 5 работы программы....
Конечно, следить никто не отменял...но часто собрать одному разработчику всё нереально, а билд конвееры могут быть настроены черти-как .....



Abyx, попробуйте сделать с 50 DLL и попередавать std-шные объекты и указатели на них между DLL - будет весело (а еще поиграйтесь в нескольких проектах настройками компилятора и линковщика)..... в общем это не спасение, более того, например отладка утечек памяти в подобных длл весьма и весьма нетривиальна (переопределите new и delete для отладки например).....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
borisbn
Дата 23.7.2010, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 2
Всего: 135



Цитата(jonie @  22.7.2010,  22:33 Найти цитируемый пост)
передал я значится std::string* .... которую создал в одном CRT, а убил в другом

Цитата(jonie @  22.7.2010,  22:33 Найти цитируемый пост)
попередавать std-шные объекты и указатели на них между DLL


так этого вообще нельзя делать. Ведь понятно же, что объект stl, созданный в одном CRT нельзя даже использовать, а не только удалять, в другом CRT, т.к. stl оговаривает только интерфейс своих объектов, а никак не реализацию ( даже последовательность объявления методов не оговорена, а тем более последовательность и количество членов класса ). Для этого существуют простые типы char * вместо std::string, int * + size_t вместо std::vector. В данном случае даже установка и настройка всех CRT, использовавшихся при сборке exe и dll не спасёт.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
jonie
Дата 23.7.2010, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



borisbn, ок. Давайте посмотрим на реализацию log4cxx от апача.. да примером может быть много. Передавать можно, вполне себе, если настройки компиляции и CRT одна и таже. Конкретно в моем случае CRT была тожа одна (9-ая), но разных версий.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
maxim1000
Дата 23.7.2010, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



"CRT одна и та же" не то же самое, что одной и той же версии
сам экземпляр должен быть один

если приложение состоит из нескольких модулей, и память, выделенная в одном модуле, освобождается в другом, нужно использовать CRT в виде DLL

ну и, естественно, таскать его с собой в инсталляторе


--------------------
qqq
PM WWW   Вверх
jonie
Дата 23.7.2010, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



кстати, кому интересно, стоит почитать про winSxS папку тут http://msdn.microsoft.com/en-us/library/aa...28VS.85%29.aspx (раздел "Side-by-side Assemblies" и далее)....

maxim1000 ну да, я немного не так сказал - у меня получилось загрузить два инстанса crt9 и произошел сбой.

Это сообщение отредактировал(а) jonie - 23.7.2010, 09:18


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
borisbn
Дата 23.7.2010, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 2
Всего: 135



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 никаких не было.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Dem_max
Дата 23.7.2010, 11:47 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39



borisbn правильный подход


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Abyx
Дата 23.7.2010, 11:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: нет
Всего: 10



а еще можно бросить этот ####й C++ и писать на C#
PM MAIL   Вверх
Dem_max
Дата 23.7.2010, 12:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39



ага и в дистрибутив включать .NET Framework


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
jonie
Дата 23.7.2010, 12:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



borisbn, в указанных тобой случаях это да, необходимо. Но зачастую есть исключения - это не хорошо и не плохо - это нормально.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
VSB
Дата 7.8.2010, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.8.2007

Репутация: нет
Всего: 2



Dem_max
2010 год уже к концу идет, пора бросить XP а в висте и 7 уже есть .NET из коробки (правда в 7 только до 3,5 версии).
PM MAIL   Вверх
Dem_max
Дата 7.8.2010, 18:40 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39



Цитата

2010 год уже к концу идет, пора бросить XP а в висте и 7 уже есть .NET из коробки (правда в 7 только до 3,5 версии).

Это не правильный подход.
Eсли что напомню, на сей момент до сих пор работают программы под MS-DOS, собственно говоря WinXP еще долго будет на плаву.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0968 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.