Friday, January 14, 2011

Переход с Visual Studio 2005 на Visual Studio 2010

После того, как в нашем проекте стало появляться все больше кода, который требует SDK для Windows 7, все таки решились на переход с Visual Studio 2005 на новую Visual Studio 2010.

Может быть я что-то пропустил, потому что не видел студии 2008, но в этой последней изменений не так мало, из-за чего с переносом всего нашего объемного кода пришлось повозиться.

Во-первых, в новой студии теперь используется система MSBuild, вместо VCBuild. Из-за этого некоторые файлы и понятия ушли, а им на смену пришли новые. Например, вместо одного файла проекта с расширением .vcproj, теперь есть два файла .vcxproj и .filters. Настройки сборки хранятся в файле проекта, а структура представления содержимого проекта вынесена в отдельный файл. Свойство "$(TargetName)" теперь показывается в виде отдельного поля на вкладке свойств проекта "Общие". По умолчанию это свойство при конвертации равняется "$(ProjectName)", хотя имя выходного файла может не совпадать с названием проекта. В этом случае стоит сравнить значение этого поля и поля "Output File" на вкладке общих настроек линковщика. Чтобы не мучиться это свойство можно задать как "$(OutDir)$(TargetName)$(TargetExt)" и потом уже играться только с общими настройками проекта. Подробнее про изменения в структуре проектов см. статью Изменения системы построения.

Второе. Если раньше студия автоматом линковала проект с зависимыми библиотеками на основе дерева зависимостей проекта, то теперь, этого недостаточно - нужно явно прописать все библиотеки в настройках линковщика, иначе посыпятся сообщения сообщения об "unresolved externals". Об этой проблеме и других причинах приводящих к ошибке линковки см. статью Linker Tools Error LNK2019.

Третье. Для новой студии был частично переписан код реализации STL. Это было сделано в рамках цели включить поддержку нескольких фишек C++0x, таких как, например, лямбда выражения, и повысить надежность того, что уже есть. Я столкнулся с тем, что код, написанный давным давно кем-то из бывших разработчиков нашего софта перестал работать. При использовании std::set итераторы на элементы ассоциативного контейнера стали константными. Оказалось, что теперь iterator и const_iterator для std::set на самом деле оба являются константными. Подробнее о этой проблеме и других возможных проблемах при портировании кода с использованием STL см. статью STL Breaking Changes in Visual Studio 2010 Beta 1


Четвертое. Настройки VC++ Directories переехали из глобальных настроек Visual Studio в настройки проекта. На конвертацию из 2005 студии это никак не повлияло и все настройки путей были автоматом подхвачены из Visual Studio 2005 и перенесены в конвертируемые проекты (когда я переносил solution на машине стояло сразу две студии - 2005 и 2010).

Давно думал над тем, что нужно выбрать время и вынести настройки однотипных проектов, например, плагинов, в файлы свойств (раньше .vsprops, а теперь .props), которые позволяют применять изменения сразу к нескольким проектам, которые наследуют свойства от общего файла настроек. Жаль, что не сделал это перед конвертацией, это тоже сэкономило бы какое-то время и пригодилось в будущем. Подробнее про настройки свойств проектов см. статью Property Sheets (C++)

Еще одно важное замечание... После перехода на Visual Studio 2010 собранные программы будут работать только под Windows XP SP3 и выше. Чтобы заставить программу запускаться под Windows 2000 можно попробовать следующий рецепт.

No comments: