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

100

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

Филипвр
источник
Как мне установить целевую архитектуру для моего проекта?
philipvr
В этом случае ванильный проект не потерпит неудачу. Что вы изменили по сравнению с ванильным проектом? Что находится в строке 135 файла winnt.h? Вы даже смотрели на эту строку заголовочного файла. Сообщение об ошибке дает вам некоторую помощь.
Дэвид Хеффернан
вы сможете решить это отсюда; вероятно, нужно вернуться до строки 127, хотя, чтобы получить полную картину. Казалось бы, ясно, что Эдвин был прав.
Дэвид Хеффернан
Попробуйте новый проект msvs (фиктивный) и скопируйте и перетащите в него свои источники. Попробуйте скомпилировать его, и если да, сравните с вашим исходным проектом. Кстати, не копируйте stdafx. *
engf-010
Звучит плохо. Но перед повторной установкой вы можете сначала попробовать его с новым решением, и если это не сработает, вы можете вручную переустановить project = templates (погуглите).
engf-010

Ответы:

156

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

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

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

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

Филипвр
источник
Я думал об этом, но не мог представить, что вы не включили windows.h.
engf-010
1
windows.h определяет алькинд других определений на основе переключателей компилятора и включает множество WINAPI-заголовков, некоторые из которых зависят от вещей, определенных windows.h.
engf-010
Поздравляем, вы устранили проблему и у вас достаточно репутации, чтобы проголосовать!
Дэвид Хеффернан
1
Ни windows.h, ни windowsx.h (я предполагаю, что это одно и то же, но все равно пробовали оба) не помогают в этом #error Hey man you gotta choose a target.. Что еще можно исправить?
rsethc
Внимание: похоже, включает Xinput.h до того, как Windows.h тоже вызывает это.
Йенс Окерблом,
26

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

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

Натан Рид
источник
5
Именно мое решение! Спасибо, что сэкономили мне часы разочарования.
Acidic9
5

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

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

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

РЕДАКТИРОВАТЬ: у вас есть / D "WIN32" в вашей командной строке?

engf-010
источник
Должно быть, _WIN32а не WIN32? Это не моя область знаний, но, учитывая, что заголовок ищет _WIN64"_AMD64_" и т. Д., Это может показаться правдоподобным.
Дэвид Хеффернан
@ Дэвид Хеффернан: в командной строке написано WIN32 (без _) даже для x84. Не знаю объяснения этого (но кто понимает MS)
engf-010
4
@ Эдвин x84? Это компьютер Джорджа Оруэлла?
Дэвид Хеффернан
@ Дэвид Хеффернан: да, старший брат наблюдает за мной! (очевидно, x64 я имел в виду)
engf-010
В моем случае _WIN32 был определен и был виновником. Я строил для x64. Ваш ответ направил меня на правильный путь. Отличная работа!
Эрве Мутомбо
4

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

Дэвид Хеффернан
источник
AMD64 будет определен при некоторых условиях: #if! Defined ( 68K ) &&! Defined ( MPPC ) &&! Defined ( X86 ) &&! Defined ( IA64 ) &&! Defined ( AMD64 ) && defined (_M_AMD64)
engf-010,
@Edwin Если _AMD64_или _IA64_был определен, то он не получал бы ошибку. Так написано в заголовочном файле.
Дэвид Хеффернан
philipvr обновил свой пост. У него другие (более) проблемы. Он думает переустановить MSVS.
engf-010
4

Если вы используете 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, поэтому, если вы не можете включить этот заголовок, ваш компиляция может завершиться ошибкой.

Мелардев
источник
3

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

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

#include <windows.h>
Майкл Хэфрати
источник
Это исправило мои сборки x86 и x64. Мне нужно было добавить эти строки раньше #include <WinUser.h>.
Джонатан Лидбек,
2

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

MxNx
источник
1
Для меня добавлен ReSharperconsoleapi2.h
SWdV 08
2

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

#include <fileapi.h>

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

Шитал Шах
источник
У меня точно такая же ситуация.
ДЖО
2

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

#define _X86_
#define _AMD64_
#define _ARM_

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

Андреа Аральдо
источник
1

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

Лори Стерн
источник
Еще одно посещение этой страницы произошло, когда у старого проекта в заголовке CriticalSection был `#include <synchapi.h>`.
Laurie Stearn
0

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

Брайан
источник