Подтвердить что ты не робот

Неустранимая ошибка: "Нет целевой архитектуры" в Visual Studio

Когда я пытаюсь скомпилировать мой проект С++ с использованием 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, но я до сих пор не знаю, как ее исправить.

4b9b3361

Ответ 1

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

На странице windows.h wikipedia:

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

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

Ответ 2

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

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

Ответ 3

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

использовать #include <SDKDDKVer.h>

Созданные с помощью MSVS проекты включают в себя создание локальной "targetver.h", которая включена "stdafx.h", которая компилируется в предварительно скомпилированный заголовок через "stdafx.cpp".

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

#include <fileapi.h>

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

Ответ 9

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

#define _X86_
#define _AMD64_
#define _ARM_

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

Ответ 10

Решите это, поместив следующие файлы и определение в первую очередь:

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

#include <windows.h>

Ответ 11

Если вы используете Resharper, убедитесь, что он не добавляет неправильный заголовок, наиболее распространенные случаи с ReSharper:
- #include <consoleapi2.h
- #include <apiquery2.h>

UPDATE:
Еще одно предложение - проверить, используете ли вы "частичный Windows.h", я имею в виду, что если вы включите, например, winbase.h или minwindef.h, у вас может получиться такая ошибка, добавьте "большой" вместо Windows. час Есть также некоторые менее очевидные случаи, которые я прошел, наиболее заметным был случай, когда я включил только synchapi.h, в документах четко указано, что заголовок должен быть включен для некоторых функций, таких как AcquireSRWLockShared, но это вызвало отсутствие целевой архитектуры, исправление должен был удалить synchapi.h и включить "большой" Windows.h. Windows.h - огромный, он определяет макросы (многие из них устраняют ошибку "Нет целевой арки") и включают в себя множество других заголовков. В заключение всегда проверяйте, используете ли вы какой-либо заголовок, который можно заменить на Windows.h.