Неустранимая ошибка: "Нет целевой архитектуры" в 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, но я до сих пор не знаю, как ее исправить.
Ответы
Ответ 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.
Ответ 12
https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects
необходимо установить это, чтобы избавиться от этой проблемы, взять свежий код Smaple, а затем скомпилировать...