philipvr
philipvr

Reputation: 6358

Fatal error: "No Target Architecture" in Visual Studio

When I try to compile my c++ project using Visual Studio 2010 in either Win32 or x64 mode I get the following error:

>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(135): fatal error C1189: #error : "No Target Architecture"

My preprocessor definitions say WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)

What is causing this error and how do I fix it?

// 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

Update: I created a new msvs project and copied my code to it. I no longer have error : "No Target Architecture", but now I have a bunch of compile errors involving winnt.h and winbase.h and no compile errors involving any of my files. Is it possible these files are corrupted? Do I need to reinstall MSVS 2010?

Update 2: So I narrowed down my problem and found that it is #include <WinDef.h> that is causing all of my compile errors with winnt.h but I still don't know how to fix it.

Upvotes: 172

Views: 193306

Answers (15)

Dawid Moskalczuk
Dawid Moskalczuk

Reputation: 3

Like before Анатолий Иванов give answer:

#include <windows.h>
#include <iostream>
#include <processthreadsapi.h>

but in my case was to remember position of windows.h before "iostream".

Upvotes: 0

The Oathman
The Oathman

Reputation: 165

for me I was using glfw and imgui, and I included this header file by mistake:

#include <stringapiset.h>

I just removed it and this error no longer

Upvotes: 0

Anatolii Ivanov
Anatolii Ivanov

Reputation: 109

windows 10x64 pro build 19044.1586

My case was in order of .h files

Like this is dosen't work

#include <processthreadsapi.h>
#include <iostream>
#include <windows.h>

But works like this

#include <windows.h>
#include <iostream>
#include <processthreadsapi.h>

Upvotes: 7

A T
A T

Reputation: 13826

If you want to avoid explicitly including a specific Windows SDK header, then something like this should work:

#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
#define _AMD64_
#elif defined(i386) || defined(__i386) || defined(__i386__) || defined(__i386__) || defined(_M_IX86)
#define _X86_
#elif defined(__arm__) || defined(_M_ARM) || defined(_M_ARMT)
#define _ARM_
#endif

Upvotes: 3

Melardev
Melardev

Reputation: 1162

If you are using Resharper make sure it does not add the wrong header for you, very common cases with ReSharper are:

  • #include <consoleapi2.h
  • #include <apiquery2.h>
  • #include <fileapi.h>

UPDATE:
Another suggestion is to check if you are including a "partial Windows.h", what I mean is that if you include for example winbase.h or minwindef.h you may end up with that error, add "the big" Windows.h instead. There are also some less obvious cases that I went through, the most notable was when I only included synchapi.h, the docs clearly state that is the header to be included for some functions like AcquireSRWLockShared but it triggered the No target architecture, the fix was to remove the synchapi.h and include "the big" Windows.h.

The Windows.h is huge, it defines macros(many of them remove the No target arch error) and includes many other headers. In summary, always check if you are including some header that could be replaced by Windows.h because it is not unusual to include a header that relies on some constants that are defined by Windows.h, so if you fail to include this header your compilation may fail.

Upvotes: 12

Michael Haephrati
Michael Haephrati

Reputation: 4215

Solve it by placing the following include files and definition first:

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

#include <windows.h>

Upvotes: 18

Andrea Araldo
Andrea Araldo

Reputation: 1442

At the beginning of the file you are compiling, before any include, try to put ONE of these lines

#define _X86_
#define _AMD64_
#define _ARM_

Choose the appropriate, only one, depending on your architecture.

Upvotes: 4

Shital Shah
Shital Shah

Reputation: 68708

Besides causes described already, I received this error because I'd include:

#include <fileapi.h>

Apparently it was not needed (despite of CreateDirectoryW call). After commenting out, compiler was happy. Very strange.

Upvotes: 2

MxNx
MxNx

Reputation: 1374

I had a similar problem. In my case, I had accidentally included winuser.h before windows.h (actually, a buggy IDE extension had added it). Removing the winuser.h solved the problem.

Upvotes: 5

Laurie Stearn
Laurie Stearn

Reputation: 999

Another reason for the error (amongst many others that cropped up when changing the target build of a Win32 project to X64) was not having the C++ 64 bit compilers installed as noted at the top of this page.
Further to philipvr's comment on child headers, (in my case) an explicit include of winnt.h being unnecessary when windows.h was being used.

Upvotes: 1

philipvr
philipvr

Reputation: 6358

Use #include <windows.h> instead of #include <windef.h>.

From the windows.h wikipedia page:

There are a number of child header files that are automatically included with windows.h. Many of these files cannot simply be included by themselves (they are not self-contained), because of dependencies.

windef.h is one of the files automatically included with windows.h.

Upvotes: 242

Nathan Reed
Nathan Reed

Reputation: 3906

Another cause of this can be including a header that depends on windows.h, before including windows.h.

In my case I included xinput.h before windows.h and got this error. Swapping the order solved the problem.

Upvotes: 44

Brian
Brian

Reputation: 29

If you are building 32bit then make sure you don't have _WIN64 defined for your project.

Upvotes: 0

David Heffernan
David Heffernan

Reputation: 612784

It would seem that _AMD64_ is not defined, since I can't imagine you are compiling for Itanium (_IA64_).

Upvotes: 4

engf-010
engf-010

Reputation: 3929

_WIN32 identifier is not defined.

use #include <SDKDDKVer.h>

MSVS generated projects wrap this include by generating a local "targetver.h"which is included by "stdafx.h" that is comiled into a precompiled-header through "stdafx.cpp".

EDIT : do you have a /D "WIN32" on your commandline ?

Upvotes: 5

Related Questions