Win32またはx64モードでVisual Studio 2010を使用してc ++プロジェクトをコンパイルしようとすると、次のエラーが表示されます。
>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(135): fatal error C1189: #error : "No Target Architecture"
私のプリプロセッサ定義はWIN32; _DEBUG; _CONSOLE;%(PreprocessorDefinitions)と言います
このエラーの原因と修正方法を教えてください。
// winnt.h: lines 127-136, MSVS says this is an inactive preprocessor block
#if defined(_WIN64)
#if defined(_AMD64_)
#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
#Elif defined(_IA64_)
#define PROBE_ALIGNMENT( _s ) (TYPE_ALIGNMENT( _s ) > TYPE_ALIGNMENT( DWORD ) ? \
TYPE_ALIGNMENT( _s ) : TYPE_ALIGNMENT( DWORD ))
#else
#error "No Target Architecture"
#endif
更新:新しいmsvsプロジェクトを作成し、コードをコピーしました。私はもうerror : "No Target Architecture"
、しかし今はwinnt.hとwinbase.hに関連するコンパイルエラーがたくさんありますが、どのファイルにもコンパイルエラーはありません。これらのファイルが破損している可能性はありますか? MSVS 2010を再インストールする必要がありますか?
アップデート2:問題を絞り込んだところ、#include <WinDef.h>
これはwinnt.hでのすべてのコンパイルエラーの原因ですが、まだ修正方法がわかりません。
#include <windows.h>
の代わりに#include <windef.h>
を使用します。
windows.h
wikipediaページから:
windows.h
に自動的に含まれる子ヘッダーファイルがいくつかあります。これらのファイルの多くは、依存関係があるため、単純に単独で含めることはできません(それらはself-containedではありません)。
windef.h
は、windows.h
に自動的に含まれるファイルの1つです。
この別の原因は、windows.h
を含める前に、windows.h
に依存するヘッダーを含めることです。
私の場合、xinput.h
の前にwindows.h
を含めたところ、このエラーが発生しました。順序を入れ替えることで問題が解決しました。
_WIN32識別子が定義されていません。
#include <SDKDDKVer.h>
を使用します
MSVSで生成されたプロジェクトは、"targetver.h"
によってプリコンパイル済みヘッダーにコンパイルされる"stdafx.h"
に含まれるローカル"stdafx.cpp"
を生成することにより、このインクルードをラップします。
編集:コマンドラインに/ D「WIN32」がありますか?
_AMD64_
は定義されていません。Itanium用にコンパイルしているとは想像できないからです(_IA64_
)。
32ビットをビルドする場合は、プロジェクトに_WIN64が定義されていないことを確認してください。
コンパイルしているファイルの先頭で、include
の前に、これらの行の1つを入れてみてください。
#define _X86_
#define _AMD64_
#define _ARM_
アーキテクチャに応じて、適切な1つだけを選択してください。
同様の問題がありました。私の場合、誤ってwinuser.h
をwindows.h
の前にインクルードしていました(実際、バグのあるIDE拡張機能によって追加されました)。winuser.h
を削除すると問題は解決しました。
Resharperを使用している場合は、間違ったヘッダーが追加されないようにしてください。ReSharperでよくあるケースは次のとおりです。
-#include <consoleapi2.h
-#include <apiquery2.h>
[〜#〜] update [〜#〜]:
もう1つの提案は、「部分的なWindows.h」を含めているかどうかを確認することです。たとえば、winbase.hまたはminwindef.hを含めた場合、そのエラーが発生する可能性があります。代わりにWindows.h。また、私が経験したそれほど明白ではないケースもいくつかあります。最も注目すべきは、synchapi.hのみをインクルードしたときでしたsynchapi.hを削除し、「大きな」Windows.hを含めることでした。 Windows.hはヒューであり、マクロを定義し(それらの多くはターゲットアーチなしエラーを削除します)、他の多くのヘッダーを含みます。 要約、Windows.hで置き換えることができるのヘッダーが含まれているかどうかを常に確認します。
すでに説明した原因に加えて、次の項目を含めるため、このエラーを受け取りました。
#include <fileapi.h>
どうやらそれは必要ありませんでした(CreateDirectoryW呼び出しにもかかわらず)。コメントアウトした後、コンパイラは満足しました。非常に奇妙な。
最初に次のインクルードファイルと定義を配置して解決します。
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
この問題を取り除くためにこれをインストールする必要があり、新しいsmapleコードを取得してコンパイルします...