web-dev-qa-db-ja.com

致命的なエラー:Visual Studioの「ターゲットアーキテクチャなし」

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でのすべてのコンパイルエラーの原因ですが、まだ修正方法がわかりません。

81
philipvr

#include <windows.h>の代わりに#include <windef.h>を使用します。

windows.h wikipediaページから:

windows.hに自動的に含まれる子ヘッダーファイルがいくつかあります。これらのファイルの多くは、依存関係があるため、単純に単独で含めることはできません(それらはself-containedではありません)。

windef.hは、windows.hに自動的に含まれるファイルの1つです。

128
philipvr

この別の原因は、windows.hを含める前に、windows.hに依存するヘッダーを含めることです。

私の場合、xinput.hの前にwindows.hを含めたところ、このエラーが発生しました。順序を入れ替えることで問題が解決しました。

16
Nathan Reed

_WIN32識別子が定義されていません。

#include <SDKDDKVer.h>を使用します

MSVSで生成されたプロジェクトは、"targetver.h"によってプリコンパイル済みヘッダーにコンパイルされる"stdafx.h"に含まれるローカル"stdafx.cpp"を生成することにより、このインクルードをラップします。

編集:コマンドラインに/ D「WIN32」がありますか?

5
engf-010

_AMD64_は定義されていません。Itanium用にコンパイルしているとは想像できないからです(_IA64_)。

4
David Heffernan

32ビットをビルドする場合は、プロジェクトに_WIN64が定義されていないことを確認してください。

1
Brian

コンパイルしているファイルの先頭で、includeの前に、これらの行の1つを入れてみてください。

#define _X86_
#define _AMD64_
#define _ARM_

アーキテクチャに応じて、適切な1つだけを選択してください。

1
Andrea Araldo

エラーの別の理由(Win32プロジェクトのターゲットビルドをX64に変更するときに発生する他の多くのエラー)には、 このページ の上部に記載されているようにC++ 64ビットコンパイラがインストールされていませんでした。
子ヘッダーに関するphilipvrのコメントに加えて、(私の場合)winnt.hの明示的なインクルード 不要 whenwindows.hが使用されていた。

1
Laurie Stearn

同様の問題がありました。私の場合、誤ってwinuser.hwindows.hの前にインクルードしていました(実際、バグのあるIDE拡張機能によって追加されました)。winuser.hを削除すると問題は解決しました。

1
MxNx

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で置き換えることができるのヘッダーが含まれているかどうかを常に確認します。

1
Melardev

すでに説明した原因に加えて、次の項目を含めるため、このエラーを受け取りました。

#include <fileapi.h>

どうやらそれは必要ありませんでした(CreateDirectoryW呼び出しにもかかわらず)。コメントアウトした後、コンパイラは満足しました。非常に奇妙な。

1
Shital Shah

最初に次のインクルードファイルと定義を配置して解決します。

#define WIN32_LEAN_AND_MEAN      // Exclude rarely-used stuff from Windows headers

#include <windows.h>
1

https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects

この問題を取り除くためにこれをインストールする必要があり、新しいsmapleコードを取得してコンパイルします...

0
Piyush Charan