понедельник, 22 октября 2007 г.

C++ Solution Upgrade: from Visual Studio 2003 to 2005

Хроника одного апгрейда.

Пришлось тут по долгу службы перевести один из проектов с Visual C++ 7.1 (2003) на VC++8 (2005). Памятуя, сколько времени я убил, когда четыре года назад переводил его с VC++ 6.0 на семерку, я заранее смирился с вечностью, полной невыносимых страданий...


Вообще я доволен - отпортировать получилось довольно быстро - проект объемом чуть больше 100K SLOC, десяток dll-ок и статических библиотек, а получилось перевести часов за 25. В прошлый раз с VC++6 недели три пришлось трахаться, потому что они там категорически наменяли в синтаксисе темплейтов.

Мини-лог по результатам конверсии

0. Когда открвыаешь solution от 7.1 новым Visual Studio, студия предлагает его отконвертить к новому формату. Конвертер, в отличии от asp.net (это отдельная печальная песня), вполне пристойно конвертит плюсовые проекты в формат "восьмерки" .

1. STLPort v4.x с VC++8 не работает. Оказалось, что http://stlport.com/ давно заброшен и разработка переехала на sourceforge (http://stlport.sourceforge.net/). Обновление, впрочем, прошло почти безболезненно - добавил пару include, да перекомпилировал гомерический шаблон _Not_within_traits прямо к себе в код, потому что шаблон теперь не public.

2. Компилятор C++ в 2005 ужесточил требования к синтаксису. От этого перестали работать конструкции вида:

for (int i =1;.....) {...}; doSomething(i)

декларацию i в данном сучае пришлось поднять над for:

int i;
for (i=1;.....) {...}; doSomething(i)

Еще теперь нельзя не указывать return type (раньше компилятор подставлял туда int). Больше они этоу мракобесную совместимость с plain C не поддерживают, и слава богу.

Из неприятных моментов - пришлось повозиться с ошибками вида "unresolved external symbol "wchar_t * __stdcall _com_util::ConvertStringToBSTR(char const *)" (?ConvertStringToBSTR@_com_util@@YGPA_WPBD@Z)" - как оказалось, разные проекты у меня имели разные настройки /Zc, отчено в библиотеке функция описывалась с native wchar_t, а в зависимой - через const unsigned char *. Не компилировалось и орало.

4. RTL/ATL

Микрософторцы в VS 2005 сделали безопасные замены для некоторых функций STL с суффиксом _s и теперь, когда компилируешь старый проект, огребаешь неимоверное количество предупреждений на эту тему. Лечил просто - добавил define _CRT_SECURE_NO_DEPRECATE и на безопасные методы переходить не стал -- не был готов перетестировать весь код да и нет пока желания использовать микросовтовскую нестандартовщину.

wcsstr теперь возвращает не wchar_t *, а const wchar_t * так что пришлось подправить код, который сохранял результаты этой функции.


Вроде, все, собралось, запыхтело, не падает :-) Отдал на тестирование.

Ссылки по теме
http://msdn2.microsoft.com/en-us/library/ms177253(VS.80).aspx
http://msdn.microsoft.com/chats/transcripts/vstudio/vstudio_061704.aspx
http://msdn2.microsoft.com/en-us/library/dh8che7s(VS.80).aspx

Комментариев нет: