При переносе старого проекта C ++ из Visual Studio 6 в Visual Studio 2012 мы обнаружили странный набор предупреждений из стандартных заголовков платформы Microsoft:
В результате онлайн-поиска только несколько человек столкнулись с этой ошибкой. В некоторых случаях люди пытались использовать VS2012 для компиляции устаревшего кода DirectX, чего я не делаю. В других случаях это были люди, которые пытались использовать VS2012 для Windows XP (используя новую опцию из Обновления 1), что я и делаю.
На вопрос DirectX был дан ответ, что всегда будет предупреждение о том, что вы компилируете устаревшую (до Win8) версию DirectX, и вам просто придется с этим смириться.
На вопрос Windows XP ответа не было. Другие люди просто сказали, что не могут воспроизвести проблему.
Я воспроизвел это и нашел причину, которую я пишу здесь, чтобы помочь всем, кто сталкивается с этим.
Зайдите в свойства проекта и найдите поле «Определения препроцессора».
В дополнение к стандартным и добавленным константам определения вы должны увидеть макрос:
%(PreprocessorDefinitions)
Этот макрос, по-видимому, вводит некоторые дополнительные определения препроцессора, предоставляемые компилятором. Я не уверен, что версия Visual Studio представила этот макрос, но это там не было в Visual Studio 6.
В Visual Studio 2012 этот макрос требуется присутствовать в поле «Определения препроцессора» вашего проекта. Это также может потребоваться в более ранних версиях Visual Studio, но я не проверял их.
Если этот макрос отсутствует, вы увидите сообщения об ошибках, как показано выше.
Нигде не найдено решение этой проблемы, поэтому вот что сработало для меня.
Я строю проект с инструментами 110_xp
Я получаю эти предупреждения …
c:\program files (x86)\microsoft sdks\windows\v7.1a\include\sal_supp.h(57): warning C4005: '__useHeader' : macro redefinition
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\sal.h(2872) : see previous definition of '__useHeader'
c:\program files (x86)\microsoft sdks\windows\v7.1a\include\specstrings_supp.h(77): warning C4005: '__on_failure' : macro redefinition
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\sal.h(2882) : see previous definition of '__on_failure'
Совершенно очевидно несоответствие между заголовками VC 11 и заголовками 7.1a sdk.
В моем stdafx.cpp я сделал это …
#define _USING_V110_SDK71_
#include "stdafx.h"
… проблема сборки ушла.
ОБНОВИТЬ:
Увидеть Эдмунд«s ответ на этот же вопрос сначала — попробуй. Если это работает, отлично! Если нет … попробуйте следующее:
ОРИГИНАЛ:
Используйте обходной путь, упомянутый на вкладке «Временные решения» этой веб-страницы:
А именно, добавьте:
#define _USING_V110_SDK71_ 1
…прямо в файле .rc до он включает в себя все, что будет включать системные заголовки, которые вызывают это предупреждение.
Это предупреждение компилятора ресурса. Решение простое. Щелкните правой кнопкой мыши файл .rc в обозревателе решений и выберите «Свойства». Теперь перейдите в Ресурсы> Общие> Определения препроцессора и добавьте
%(PreprocessorDefinitions)
Для меня другое решение сработало.
В проекте свойства → Свойства конфигурации → C / C ++ → генеральный, Я сменил поле Дополнение включает каталоги путь к SDK с этим макросом:
$(WindowsSDK_IncludePath)
До этого в этом поле был путь к моему SDK v7.1, и у меня были те же предупреждения.
Добавление #define _USING_V110_SDK71_
в Stdafx.cpp или Stdafx.h не будет работать, если ваши файлы cpp не имеют предварительно скомпилированных заголовков.
Чтобы решить эту проблему, работает следующее.
Щелкните правой кнопкой мыши проект в обозревателе решений * → свойства → C / C ++ → препроцессор → Определение препроцессора → редактировать → Добавить _USING_V110_SDK71_
Это все еще проще.
Просто установите флажок «Наследовать от родительского или проекта по умолчанию» в Свойства конфигурации → C / C ++ → Определения препроцессора / препроцессора → редактировать.
Для меня это произошло с Visual Studio 2017 (как свежая, так и восстановленная установка). Очевидно, что Windows 7.1 SDK был установлен до VS2017 и был интегрирован в установку Visual Studio 2005.
В моем случае два файла:
%LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props
%LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user.props
содержал ссылки на каталоги включения и библиотеки Windows 7.1 SDK. Удаление этих ссылок сделало свою работу.
Помните, что каждый отдельный проект C ++ для Win32 и x64 соответственно наследуется от этих таблиц свойств.