2013-01-16 2 views
25

Хотя миграция старый проект C++ от Visual Studio 6 до Visual Studio 2012, мы столкнулись с нечетными предупреждений внутри стандартных заголовков платформы Microsoft:VS2012 C++ предупреждение C4005: «__useHeader»: макро переопределение

  • предупреждение C4005: «__useHeader»: макро переопределение
  • предупреждение C4005: «__on_failure»: макро переопределение

поиск в Интернете можно найти только несколько других людей, работающих в этой ошибки. В некоторых случаях именно люди пытались использовать VS2012 для компиляции устаревшего кода DirectX, чего я не делаю. В других случаях именно люди пытались использовать VS2012 для установки на Windows XP (используя новую опцию из Update 1), которую я делаю.

На вопрос DirectX было отправлено предупреждение о том, что вы будете компилировать с устаревшей версией DirectX (pre-Win8), и вам просто нужно будет с ней жить ,

На вопрос Windows XP не ответил. Другие люди просто сказали, что они не могут воспроизвести проблему.

Я воспроизвел его и нашел причину, которую я пишу здесь, чтобы помочь любому, кто сталкивается с этим.

ответ

17

Перейдите в свойства проекта и найдите поле «Определения препроцессора».

В дополнение к умолчанию и константы добавлены определения, вы должны увидеть макрос:

%(PreprocessorDefinitions) 

Этот макрос, по-видимому приносит в некоторых дополнительных определений препроцессора компилятора при условии. Я не уверен, что версия Visual Studio представил этот макрос, но не было в Visual Studio 6.

В Visual Studio 2012, этот макрос требуется присутствовать в области определения препроцессора вашего проекта. Это также может потребоваться в более ранних версиях Visual Studio, но я их не тестировал.

Если этот макрос отсутствует, вы увидите сообщения об ошибках, как показано выше.

+7

Этот макрос добавлен при переходе с VS2005 на VS2012 по умолчанию и не был полезен в моем случае. Однажды я сменил каталог SDK include от v7.1A на '$ (WindowsSDK_IncludePath)', который является версией 8.0, все предупреждения пошли. – alex555

+2

У меня есть% (PreprocessorDefinitions), и я до сих пор получаю предупреждения.Решение с $ (WindowsSDK_IncludePath) работало для меня. –

+2

Это также может происходить, когда отдельные исходные файлы имеют определения препроцессора, которые переопределяют определения проекта. –

9

Не нашли решение для публикации в любом месте в Интернете, поэтому вот что сработало для меня.

Я строю проект с 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" 

... проблема сборки ушла.

+1

Я получил аналогичные предупреждения, как всплывающие окна при открытии ресурсов в редакторе ресурсов, и этот совет отлично поработал, чтобы удалить их. –

+0

Мне тоже, но мне пришлось использовать ... #if _USING_V110_SDK71_ == 1/#define _USING_V110_SDK71_ 1/#endif // ... чтобы избежать того же предупреждения при компиляции stdafx.cpp. По-видимому, они автоматически помещают a/D "_USING_V110_SDK71_" в командные строки компилятора и компилятора ресурсов, когда для набора инструментов платформы установлено значение v110_xp. Очень странно, что это исправление влияет на загрузку ресурсов в представлении ресурсов Visual Studio. Но не поймите меня неправильно, я рад, что это так. Благодаря! – DLRdave

+0

Я забираю это обратно ..... это исправление не работает для меня навсегда. Я все еще ошибаюсь, делая это так. Мне пришлось использовать обходное решение, упомянутое здесь: http://connect.microsoft.com/VisualStudio/feedback/details/789965/resource-editor-warning-rc4005-on-toolset-visual-studio-2012-windows-xp-v110 -xp, чтобы полностью избавиться от предупреждения. – DLRdave

5

Это предупреждение компилятора ресурса. Решение легко. Щелкните правой кнопкой мыши файл .rc в проводнике решений и выберите «Свойства».Теперь переходим к ресурсам> Общие> препроцессора Определения и добавьте

%(PreprocessorDefinitions) 
+1

Ошибка C4005 - ошибка компилятора, но некоторые люди получают _RC_ 4005 из компилятора ресурсов, и в этом случае это их решение. По какой-то причине ** отдельные .rc-файлы ** теряют свои унаследованные настройки. –

7

UPDATE:

См Edmund «s answer to this same question первый - дать, что попробовать. Если это сработает, отлично! Если нет ... попробуйте следующее:

ORIGINAL:

Используйте обходной указанны на вкладке "обходные" этой веб-страницы:

http://connect.microsoft.com/VisualStudio/feedback/details/789965/resource-editor-warning-rc4005-on-toolset-visual-studio-2012-windows-xp-v110-xp

А именно, добавьте:

#define _USING_V110_SDK71_ 1 

... непосредственно в файле .rc до включает в себя все, что будет включать заголовок системы которые вызывают это предупреждение.

+0

Желание я видел это некоторое время назад. – Blazes

+1

Нет, не делайте этого. См. Ответ Эдмунда - убедитесь, что отдельные .rc-файлы правильно наследуют настройки проекта. –

+0

Спасибо за комментарий - я поддержал и связал ответ Эдмунда. (Хотя, я уверен, что он работает без личной проверки. С тех пор мы перешли на VS 2013, а отдельные .rc-файлы показывают, что унаследованные defs просто прекрасны в VS 2013 ...) – DLRdave

2

Это еще проще.

Просто установите флажок "Наследовать от родительского или проекта по умолчанию" в Configuration PropertiesC/C++Preprocessor/Препроцессор ОпределенияEdit.

3

Добавление #define _USING_V110_SDK71_ в Stdafx.cpp или Stdafx.h не будет работать, если ваши файлы cpp не имеют предварительно скомпилированных заголовков.

Для решения этой проблемы необходимо выполнить следующие действия.

Щелкните правой кнопкой мыши проект в обозревателе решений * → СвойстваC/C++ПрепроцессорПрепроцессор определениередактировать → Добавить _USING_V110_SDK71_

3

Для меня другое решение работало.

В проекте СвойстваСвойства конфигурацииC/C++Общие, я изменил Сложение поле Включить директориях путь к SDK с помощью этого макроса:

$(WindowsSDK_IncludePath) 

До этого , это поле имело путь к моему SDK v7.1, и у меня были такие же предупреждения.

0

У меня была эта проблема в некоторых проектах, которые возникли с VC++ 2003 и постепенно менялись с годами. Я обнаружил, что, хотя настройки проекта имели %(PreprocessorDefinitions) в определениях препроцессора, некоторые из .cpp-файлов не были (самые старые). После того, как вы изменили их на «Наследовать от родительских или проектов по умолчанию», он избавился от предупреждений.

+0

Я действительно закончил модификацию проекта файлы и удаление всех элементов xml для свойств, специфичных для файла, внутри каждого элемента .cpp-файла ''. –

0

Хотя этот ответ для VS10, она представляет интерес, как может дать некоторые подсказки относительно того, что происходит именно в VC++ каталоги макросов: предупреждение появилось, когда эти заявления были добавлены в заголовочном файле проекта, MyApp:

#ifndef NTDDI_WINXPSP3 
#define NTDDI_WINXPSP3 0x05010300 
#endif 
#ifndef NTDDI_VISTA 
#define NTDDI_VISTA 0x06000000 
#endif 
#ifndef NTDDI_VISTASP1 
#define NTDDI_VISTASP1 0x06000100 
#endif 
#ifndef NTDDI_WS08 
#define NTDDI_WS08 0x06000100 
#endif 

предупреждения, такие как следующие выскочило для всех, кроме XPSP3 защиту .:

Предупреждение RC4005: 'NTDDI_VISTASP1': переопределение C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7. 0A \ include \ sdkddkver.h .., MyApp

MyApp был WinDebug 32 билд, отметив Windows7.1SDK появился в разделе X64 файла PROJ:

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> 
<PlatformToolset>Windows7.1SDK</PlatformToolset> 

наследуемое значение для определения препроцессора был _VC80_UPGRADE = 0x0600. Использовав SDK набор инструментов до возвращения к V100, библиотеки SDK были найдены как inherited_from в Включить каталоги и библиотека каталогов в VC++ Directories разделе, как было отмечено here.
Похоже, что предупреждение генерируется в результате сочетания изменений, изменений или изменений набора инструментов.

Edit: несвязанный вопрос в VS2017 (MBCS) склоняется использовать

LoadCursorW(nullptr, IDC_ARROW) 

вместо значения по умолчанию LoadCursorA(...) в структуре WNDCLASSEXW. Возможное решение пересмотреть так:

#define IDC_ARROW   MAKEINTRESOURCEW(32512) 

Здесь предупреждение может быть подавлено с помощью #undef procedure до проведения #define:

#ifdef IDC_ARROW 
#undef IDC_ARROW 
#endif 
#define IDC_ARROW   MAKEINTRESOURCEW(32512) 
1

Для меня это случилось с Visual Studio 2017 (как свежие, так и отремонтированная установка). Очевидно, что SDK Windows 7.1 был установлен до VS2017 и был интегрирован в установку Visual Studio 2005.

В моем случае два файла:

  • %LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props
  • %LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user.props

содержатся ссылки на каталоги и включают библиотеки 7.1 SDK Windows. Удаление этих ссылок выполнило эту работу.

Имейте в виду, что каждый отдельный проект на C++ для Win32 и x64 соответственно наследуется от этих листов свойств.

Смежные вопросы