Неустранимая ошибка: «Нет целевой архитектуры» в Visual Studio - PullRequest
80 голосов
/ 30 января 2011

Когда я пытаюсь скомпилировать мой проект c ++ с использованием Visual Studio 2010 в режиме Win32 или x64, я получаю следующую ошибку:

>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, но я до сих пор не знаюкак это исправить.

Ответы [ 10 ]

127 голосов
/ 31 января 2011

Используйте #include <windows.h> вместо #include <windef.h>.

Со страницы windows.h википедии:

Существует ряд дочерних заголовочных файлов, которые автоматически включаются в windows.h. Многие из этих файлов не могут быть просто включены сами по себе (они не являются автономными ) из-за зависимостей.

windef.h - это один из файлов, автоматически включаемых в windows.h.

15 голосов
/ 04 ноября 2014

Другой причиной этого может быть включение заголовка, который зависит от windows.h, до включения windows.h.

В моем случае я включил xinput.h до windows.h и получил эту ошибку.Обмен заказа решил проблему.

5 голосов
/ 30 января 2011

_WIN32 идентификатор не определен.

use #include <SDKDDKVer.h>

Проекты, созданные MSVS, включают это, генерируя локальный "targetver.h", включаемый "stdafx.h", который компилируется вprecompiled-header через "stdafx.cpp".

EDIT: у вас есть / D "WIN32" в командной строке?

4 голосов
/ 31 января 2011

Казалось бы, _AMD64_ не определено, так как я не могу представить, что вы компилируете для Itanium (_IA64_).

1 голос
/ 25 июля 2018

Помимо уже описанных причин, я получил эту ошибку, потому что я должен включать:

#include <fileapi.h>

Видимо, она не была необходима (несмотря на вызов CreateDirectoryW).После комментирования компилятор был счастлив.Очень странно.

1 голос
/ 17 ноября 2016

У меня была похожая проблема. В моем случае я случайно включил winuser.h до windows.h (на самом деле, это было добавлено в глючное расширение IDE). Удаление winuser.h решило проблему.

1 голос
/ 27 ноября 2015

Другая причина ошибки (среди многих других, возникающих при изменении целевой сборки проекта Win32 на X64) заключалась в том, что 64-битные компиляторы C ++ не были установлены, как отмечено в верхней части этой страницы ,
В дополнение к комментарию philipvr о дочерних заголовках (в моем случае) явное включение winnt.h , являющегося ненужным при использовании windows.h .

1 голос
/ 16 ноября 2013

Если вы собираете 32-битную версию, убедитесь, что для вашего проекта не определено _WIN64.

0 голосов
/ 22 января 2019

В начале файла, который вы компилируете, перед любым include, попробуйте поставить ОДНУ из этих строк

#define _X86_
#define _AMD64_
#define _ARM_

Выберите подходящую, только одну, в зависимости от вашей архитектуры.

0 голосов
/ 12 июля 2018

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

необходимо установить это, чтобы избавиться от этой проблемы, взять свежий smaple-код и скомпилировать ...

...