古いC++プロジェクトをVisual Studio 6からVisual Studio 2012に移行しているときに、標準のMicrosoftプラットフォームヘッダー内から奇妙な一連の警告に遭遇しました。
オンライン検索では、このエラーに遭遇した他の少数の人しか見つかりませんでした。場合によっては、VS2012を使用してレガシーのDirectXコードをコンパイルしようとする人がいました。他のケースでは、VS2012を使用してWindowsをターゲットにしようとする人々でしたXP(Update 1の新しいオプションを使用)-私はこれを実行しています。
DirectXの質問には、警告が常に表示され、古い(Win8より前)バージョンのDirectXでコンパイルしているので、そのまま使用する必要があることがわかります。
Windows XPの質問には回答しませんでした。他の人は、問題を再現できないと単純に言いました。
私はそれを再現し、原因を見つけました。これに遭遇した人を助けるために、ここで書いています。
プロジェクトのプロパティに移動し、「プリプロセッサ定義」フィールドを見つけます。
デフォルトおよび追加の定義定数に加えて、マクロが表示されるはずです。
%(PreprocessorDefinitions)
このマクロは、明らかにコンパイラが提供する追加のプリプロセッサ定義をもたらします。このマクロを導入したVisual Studioのバージョンはわかりませんが、Visual Studio 6ではなかったです。
Visual Studio 2012では、このマクロは必須であり、プロジェクトのプリプロセッサ定義フィールドに表示されます。 Visual Studioの以前のバージョンでも必要になる場合がありますが、これらはテストしていません。
このマクロがない場合、上記のエラーメッセージが表示されます。
更新:
Edmund の この同じ質問への回答 を参照してください-最初に試してみてください。それがうまくいけば、素晴らしい!そうでない場合は、次を試してください。
元の:
このWebページの「回避策」タブに記載されている回避策を使用してください。
すなわち、追加します:
#define _USING_V110_SDK71_ 1
...直接.rcファイルbeforeには、この警告の原因となるシステムヘッダーを含むすべてのものが含まれます。
オンラインで公開されているこれに対する解決策を見つけていないので、ここに私のために働いたものがあります。
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"
...ビルドの問題はなくなりました。
これはリソースコンパイラの警告です。解決策は簡単です。ソリューションエクスプローラーで.rcファイルを右クリックし、[プロパティ]を選択します。次に、[リソース]> [全般]> [プリプロセッサ定義]に移動し、追加します
%(PreprocessorDefinitions)
私にとっては別の解決策が働いた。
プロジェクトでプロパティ→構成プロパティ→C/C++→一般、フィールドを変更しました追加ディレクトリを含めるこのマクロでSDKへのパス:
$(WindowsSDK_IncludePath)
それ以前は、このフィールドにはSDK v7.1へのパスがあり、同じ警告が表示されていました。
Cppファイルにプリコンパイル済みヘッダーがない場合、Stdafx.cppまたはStdafx.hに#define _USING_V110_SDK71_
を追加しても機能しません。
この問題を解決するには、次のようにします。
ソリューションエクスプローラーでプロジェクトを右クリック*→プロパティ→C/C++→プリプロセッサー→プリプロセッサー定義→- 編集→_USING_V110_SDK71_を追加
まだ簡単です。
チェックボックス"親またはプロジェクトのデフォルトから継承" in 構成プロパティ→C/C++→プリプロセッサ/プリプロセッサ定義→編集。
私にとって、これはVisual Studio 2017で発生しました(新規インストールと修復インストールの両方)。明らかに、Windows 7.1 SDKはVS2017より前にインストールされ、Visual Studio 2005のインストールに統合されていました。
私の場合、2つのファイル:
%LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props
%LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user.props
windows 7.1 SDKのincludeディレクトリとライブラリへの参照が含まれていました。これらの参照を削除すると、仕事ができました。
Win32およびx64の各C++プロジェクトは、それぞれこれらのプロパティシートから継承することに注意してください。
VC++ 2003で始まり、長年にわたって段階的にアップグレードされたいくつかのプロジェクトでこの問題が発生しました。プリプロセッサ定義では、プロジェクトの設定には%(PreprocessorDefinitions)
がありましたが、いくつかの.cppファイルにはないことがわかりました(最も古いもの)。それらを「親またはプロジェクトのデフォルトから継承する」に変更すると、警告はなくなりました。
この回答は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 def。を除くすべてについて、次のような警告が表示されました。
警告RC4005: 'NTDDI_VISTASP1':再定義C:\ Program Files(x86)\ Microsoft SDKs\Windows\v7.0A\include\sdkddkver.h ..、MyApp
MyAppはWinDebug 32ビルドで、projファイルのX64セクションにWindows7.1SDKが表示されていることに注意してください。
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<PlatformToolset>Windows7.1SDK</PlatformToolset>
プリプロセッサ定義の継承値は_VC80_UPGRADE = 0x0600でした。 V100に戻す前にSDKツールセットを使用していたため、SDKライブラリはIncludeディレクトリでinherited_fromとして見つかりました)およびLibrary Directories(VC++ Directoriesセクション) here .
警告は、アップグレード、移行、またはツールセットの変更の組み合わせの結果として生成されるように見えます。
Edit:VS2017(MBCS)の無関係な問題が使用することを選択しています
LoadCursorW(nullptr, IDC_ARROW)
wNDCLASSEXW構造体のデフォルトのLoadCursorA(...)
の代わりに。可能な解決策は、次のように再定義することです。
#define IDC_ARROW MAKEINTRESOURCEW(32512)
ここでは、#undef
の前に #define
procedure を使用することにより、警告を抑制することができます。
#ifdef IDC_ARROW
#undef IDC_ARROW
#endif
#define IDC_ARROW MAKEINTRESOURCEW(32512)