Когда я пытаюсь скомпилировать свой проект 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, но я до сих пор не знаю, как это исправить.
Ответы:
Используйте
#include <windows.h>
вместо#include <windef.h>
.Со
windows.h
страницы википедии:windef.h
является одним из файлов, автоматически включенных вwindows.h
.источник
#error Hey man you gotta choose a target.
. Что еще можно исправить?Другой причиной этого может быть включение заголовка, который зависит от
windows.h
, перед включениемwindows.h
.В моем случае я включил
xinput.h
раньшеwindows.h
и получил эту ошибку. Смена порядка решила проблему.источник
Идентификатор _WIN32 не определен.
использовать
#include <SDKDDKVer.h>
Сгенерированные MSVS проекты обертывают это включение, создавая локальный объект,
"targetver.h"
который включается,"stdafx.h"
который компилируется в precompiled-header through"stdafx.cpp"
.РЕДАКТИРОВАТЬ: у вас есть / D "WIN32" в вашей командной строке?
источник
_WIN32
а неWIN32
? Это не моя область знаний, но, учитывая, что заголовок ищет_WIN64
"_AMD64_" и т. Д., Это может показаться правдоподобным.Казалось бы,
_AMD64_
это не определено, так как я не могу представить, что вы компилируете для Itanium (_IA64_
).источник
_AMD64_
или_IA64_
был определен, то он не получал бы ошибку. Так написано в заголовочном файле.Если вы используете Resharper, убедитесь, что он не добавляет неправильный заголовок для вас, очень распространенные случаи с ReSharper:
#include <consoleapi2.h
#include <apiquery2.h>
#include <fileapi.h>
ОБНОВЛЕНИЕ :
Еще одно предложение - проверить, включаете ли вы «частичный Windows.h», я имею в виду, что если вы включаете, например, winbase.h или minwindef.h, вы можете получить эту ошибку, добавьте «большую» Windows .h вместо этого. Есть также несколько менее очевидных случаев, через которые я прошел, наиболее заметным было то, что я включил только synchapi.h, в документации четко указано, что это заголовок, который должен быть включен для некоторых функций, таких как AcquireSRWLockShared, но он вызвал нет целевой архитектуры, исправление было удалить synchapi.h и включить "большой" Windows.h.
Файл Windows.h огромен, он определяет макросы (многие из них удаляют ошибку «Нет целевой арки») и включает множество других заголовков. Таким образом , всегда проверяйте, включаете ли вы какой-либо заголовок, который может быть заменен Windows.h, потому что нет ничего необычного в том, чтобы включить заголовок, который опирается на некоторые константы, определенные Windows.h, поэтому, если вы не можете включить этот заголовок, ваш компиляция может завершиться ошибкой.
источник
Решите эту проблему, разместив сначала следующие включаемые файлы и определение:
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <windows.h>
источник
#include <WinUser.h>
.У меня была аналогичная проблема. В моем случае я случайно включил его
winuser.h
раньшеwindows.h
(на самом деле его добавило некорректное расширение IDE). Удалениеwinuser.h
решенной проблемы.источник
consoleapi2.h
Помимо уже описанных причин, я получил эту ошибку, потому что включил:
#include <fileapi.h>
Судя по всему, в этом не было необходимости (несмотря на вызов CreateDirectoryW). После комментариев компилятор остался доволен. Очень странно.
источник
В начале файла, который вы компилируете, перед любым
include
, попробуйте поставить ОДНУ из этих строк#define _X86_ #define _AMD64_ #define _ARM_
Выбирайте подходящий, только один, в зависимости от вашей архитектуры.
источник
Другой причиной ошибки (среди многих других, которые возникли при изменении целевой сборки проекта Win32 на X64) было отсутствие установленных 64-битных компиляторов C ++, как указано в верхней части этой страницы .
Далее на комментарий philipvr на ребенок заголовки, (в моем случае) явном включать в winnt.h быть ненужным , когда windows.h использовались.
источник
Если вы создаете 32-битную версию, убедитесь, что для вашего проекта не определен _WIN64.
источник