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


96

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ですべてのコンパイルエラーを引き起こしていることがわかりましたが、それを修正する方法がまだわかりません。


プロジェクトのターゲットアーキテクチャを設定するにはどうすればよいですか?
philipvr 2011年

バニラプロジェクトはこの方法で失敗しません。バニラプロジェクトから何を変えましたか?winnt.hの135行目は何ですか?ヘッダーファイルのその行も確認しましたか。エラーメッセージはあなたにいくつかの助けを与えています。
David Heffernan 2011年

あなたはここからそれを解決できるはずです。全体像を把握するには、おそらく127行目の前に戻る必要があります。エドウィンが正しいことは明らかであるように思われます。
David Heffernan

新しいmsvsプロジェクト(ダミー)を試し、ソースをそれにコピーしてドラッグします。コンパイルしてみてください。コンパイルした場合は、元のプロジェクトと比較してください。ところで、stdafx。*をコピーしないでください
engf-010 2011

音が悪いですか。しかし、再インストールを行う前に、まず新しいソリューションを試してみてください。それがうまくいかない場合は、手動でproject = templatesを再インストールできます(google it)。
engf-010 2011

回答:


146

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

windows.hウィキペディアのページから:

に自動的に含まれる多数の子ヘッダーファイルがありますwindows.h。これらのファイルの多くは、依存関係があるため、単独で含めることはできません(自己完結型ではありません)。

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


私はそのことを考えましたが、windows.hが含まれていないことをイメージできませんでした。
engf-010 2011

1
windows.hは、コンパイラスイッチに基づいて他の定義のアルキンドを定義し、多くのWINAPIヘッダーを含みます。
engf-010 2011

おめでとうございます。問題修正し、投票するのに十分な担当者がいます!
David Heffernan 2011年

1
windowsx.hでもwindowsx.hでもない(私はそれらが同じものであると想定していますが、とにかく両方を試しました)はそれを助けません#error Hey man you gotta choose a target.。他に何がそれを修正できますか?
rsethc 2014年

ヘッドアップ:Windows.hの前にXinput.hをインクルードすると、これも発生します。
JensÅkerblom16年

24

これの別の原因は、インクルードするwindows.h前に、に依存するヘッダーをインクルードすることwindows.hです。

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


4
まさに私の解決策!イライラの時間を節約してくれてありがとう。
Acidic9 '20

5

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

使用する #include <SDKDDKVer.h>

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

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


それはそう_WIN32ではありWIN32ませんか?これは私の専門分野ではありませんが、ヘッダーが_WIN64、「_ AMD64_」などを探していることを考えると、もっともらしいようです。
David Heffernan、2011年

@David Heffernan:コマンドラインでは、x84であってもWIN32(_なし)と表示されます。その理由を知らない(しかし、MSを理解している人)
engf-010

4
@Edwin x84?それはジョージ・オーウェルのコンピューターですか?
David Heffernan 2011年

@David Heffernan:はい、兄貴が私を見ています!(明らかにx64を意味していました)
engf-010 2011

私の場合、_WIN32が定義されていて、それが原因でした。私はx64用にビルドしていました。あなたの答えが私を軌道に乗せた。よくやった!
Herve Mutombo、

4

_AMD64_Itanium(_IA64_)用にコンパイルしているとは思えないので、定義されていないように見えます。


AMD64は、いくつかの条件の下で定義されます!の#ifを定義した(68K!)&&(定義されたMPPC!)&&(定義されたX86!(定義される)&& IA64!)&&定義された(AMD64)&&定義された(_M_AMD64)
engf-010

@Edwin _AMD64_または_IA64_が定義されている場合、エラーは発生しません。これがヘッダーファイルの内容です。
David Heffernan 2011年

philipvrが投稿を更新しました。彼には他にも(もっと)問題があります。彼はMSVSを再インストールすることを考えています。
engf-010 2011

3

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

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

#include <windows.h>

これにより、x86とx64の両方のビルドが修正されました。以前にこれらの行を追加する必要がありました#include <WinUser.h>
Jonathan Lidbeck

2

あなたはReSharperのを使用している場合、それはあなたのための間違ったヘッダーを追加しないことを確認し、ReSharperのと非常に一般的な例は以下のとおりです。
- #include <consoleapi2.h
-#include <apiquery2.h>

更新
別の提案は、「部分的なWindows.h」を含めているかどうかを確認することです。つまり、たとえばwinbase.hまたはminwindef.hを含めた場合、そのエラーが発生する可能性があるため、代わりに「大きな」を追加しますWindows.h。私が経験したいくつかのそれほど明白ではないケースもありますが、最も注目すべきは、synchapi.hのみを含めたときでした。ドキュメントには、それがAcquireSRWLockSharedなどの一部の関数に含まれるヘッダーであることは明記されていますが、ターゲットアーキテクチャがありませんでした。修正synchapi.hを削除し、「大きな」Windows.hを含めることでした。Windows.hはマクロであり、マクロを定義し(その多くはNo target archエラーを削除します)、他の多くのヘッダーを含みます。要約すると、常にWindowsに置き換えられる可能性のあるヘッダーが含まれているかどうかを確認してください


1

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


古いプロジェクトでCriticalSectionヘッダーに `#include <synchapi.h>`が含まれているときに、このページに再度アクセスしました。
Laurie Stearn

1

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


1
私のためにReSharperが追加されましたconsoleapi2.h
SWdV

1

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

#include <fileapi.h>

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


1

コンパイルするファイルの先頭で、何よりも前にinclude、これらの行の1つを配置してください

#define _X86_
#define _AMD64_
#define _ARM_

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.