Мы используем Visual Studio 2013 на работе, и недавно я столкнулся с проблемой, которой раньше не видел.
У нас есть проект с некоторыми определениями COM в файле _i.c. Проблема заключается в том, что когда мы добавили две конфигурации к проектам и решению, вместо того, чтобы эти конфигурации были независимыми, они кажутся связанными, но только в рамках предварительно скомпилированных настроек заголовка, которые предназначены для переопределения поведения проекта для этого файла.
Первоначально в Project и Solution было две конфигурации: Debug и Release.
Это были сборки MCBS. Недавно нам потребовались дополнительные версии Unicode, поэтому теперь есть 4 конфигурации Debug, Release, Debug-UNICODE, Release-UNICODE.
Глобальный параметр проекта для файлов скомпилированных заголовков C ++ — «Использовать (/ Yu)», это верно как для исходной конфигурации Debug, так и для версии Release (и теперь также для новых).
Затем в файле _i.c задана особая настройка «Не использовать предварительно скомпилированные заголовки», это верно в исходных конфигурациях Debug и Release.
Теперь, когда мы добавили эти две другие конфигурации, когда вы пытаетесь их собрать, когда сборка попадает в файл _i.c, вы либо получаете сообщение a) что предварительно скомпилированный заголовочный файл взят из предыдущей версии компилятора, либо b) что компилятору не удалось найти stdafx.h
Однако предполагается, что файл не использует предварительно скомпилированные заголовки в соответствии с настройками проекта для этого файла (как представлено в среде IDE), однако он пытается это сделать.
Следует обратить внимание на тот факт, что когда вы меняете настройку файлов в Конфигурации выпуска, вы замечаете, что Release-UNICODE теперь также изменился на ту же настройку (и наоборот). То же самое верно для Debug и Debug-UNICODE.
Конфигурации [X] -UNICODE были созданы как копии конфигураций [X], но они не предназначены для совместного использования. Все остальные параметры, кроме предварительно скомпилированных заголовков, остаются независимыми.
Также, если вы посмотрите на сохраненный проект в файле _i.c, на самом деле в нем не указаны все конфигурации
<ItemGroup>
...
<ClCompile Include="<filename>_i.c">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug-UNICODE|Win32'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release-UNICODE|Win32'">NotUsing</PrecompiledHeader>
</ClCompile>
...
Если вы игнорируете IDE, проект собирается правильно в соответствии с тем, что содержится в файле .vcxproj, проблема в том, что IDE не может правильно его записать
Задача ещё не решена.
Других решений пока нет …