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

c

#c #Windows #visual-studio #visual-c #ошибки компилятора

Вопрос:

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

>C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludewinnt.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. Как мне установить целевую архитектуру для моего проекта?

2. Ванильный проект не завершается таким образом. Что вы изменили по сравнению с ванильным проектом? Что находится в строке 135 winnt.h? Вы хотя бы смотрели на эту строку заголовочного файла? Сообщение об ошибке дает вам некоторую помощь.

3. вы должны быть в состоянии решить это отсюда; вероятно, нужно вернуться к строке 127, чтобы получить полную картину. Казалось бы, ясно, что Эдвин был прав.

4. Попробуйте новый проект msvs (фиктивный) и скопируйте в него свои исходные тексты. Попробуйте скомпилировать его, и если это произойдет, сравните его с вашим исходным проектом. Кстати, не копируйте stdafx.*

5. Звучит плохо. Но прежде чем выполнять переустановку, вы сначала можете попробовать это с новым решением, и если это не сработает, вы можете вручную переустановить project=templates (google it).

Ответ №1:

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

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

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

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

Комментарии:

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

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

3. поздравляем, вы устранили проблему, и у вас достаточно репутации, чтобы проголосовать!

4. Ни windows.h, ни windowsx.h (я предполагаю, что это одно и то же, но все равно пробовал оба варианта) не помогают в этом #error Hey man you gotta choose a target. . Что еще может это исправить?

5. Если я включу Windows. h Мне говорят, что я не могу включить его дважды. Почему он просто не игнорирует второе включение?

Ответ №2:

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

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

Комментарии:

1. Именно мое решение! Спасибо, что избавили меня от часов разочарования.

Ответ №3:

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

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

#include <windows.h>
 

Комментарии:

1. Это исправило обе мои сборки x86 и x64. Мне нужно было добавить эти строки раньше #include <WinUser.h> .

Ответ №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 огромен, он определяет макросы (многие из них удаляют ошибку No target arch) и включает в себя множество других заголовков. В заключение, всегда проверяйте, включаете ли вы какой-либо заголовок, который может быть заменен Windows.h, потому что нет ничего необычного в том, чтобы включать заголовок, который зависит от некоторых констант, определенных Windows.h , поэтому, если вы не включите этот заголовок, ваша компиляция может завершиться неудачно.

Комментарии:

1. Спасибо. Я включаю windows.h для замены WinBase.h и fileapi.h .

Ответ №5:

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

используйте #include <SDKDDKVer.h>

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

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

Комментарии:

1. Должно ли это быть _WIN32 , а не WIN32 ? Это не моя область знаний, но, учитывая, что заголовок ищет _WIN64 , «_AMD64_` и т. Д. это казалось бы правдоподобным.

2. @David Heffernan: в командной строке написано WIN32 (no _) даже для x84. Не знаю причины этого (но кто понимает MS)

3. @Edwin x84? Это компьютер Джорджа Оруэлла?

4. @Дэвид Хеффернан: да, большой брат следит за мной ! (очевидно, я имел в виду x64)

5. В моем случае _WIN32 был определен и был виновником. Я строил для x64. Ваш ответ поставил меня на правильный путь. Хорошая работа!

Ответ №6:

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

Комментарии:

1. AMD64 будет определен при некоторых условиях: #if !определено ( 68K ) amp;amp; !определено ( MPPC ) amp;amp; !определено ( X86 ) amp;amp; !определено ( IA64 ) amp;amp; !определено ( AMD64 ) amp;amp; определено (_M_AMD64)

2. @Edwin Если _AMD64_ _IA64_ был определен or , то он не получал бы ошибку. Это то, что говорится в заголовочном файле.

3. philipvr обновил свой пост. У него другие (больше) проблемы. Он думает переустановить MSVS.

Ответ №7:

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

Комментарии:

1. Для меня добавлен ReSharper consoleapi2.h

Ответ №8:

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

 #define _X86_
#define _AMD64_
#define _ARM_
 

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

Ответ №9:

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

 #include <fileapi.h>
 

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

Комментарии:

1. У меня точно такая же ситуация.

Ответ №10:

windows 10×64 pro сборка 19044.1586

Мой случай был в порядке файлов .h

Как будто это не работает

 #include <processthreadsapi.h>
#include <iostream>
#include <windows.h>
 

Но работает так

 #include <windows.h>
#include <iostream>
#include <processthreadsapi.h>
 

Ответ №11:

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

Комментарии:

1. Еще одно посещение этой страницы возникло, когда в старом проекте случайно оказалось `#include <synchapi.h>` в заголовке CriticalSection .

Ответ №12:

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

Ответ №13:

Если вы хотите избежать явного включения определенного заголовка Windows SDK, то должно сработать что-то вроде этого:

 #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
#define _AMD64_
#elif defined(i386) || defined(__i386) || defined(__i386__) || defined(__i386__) || defined(_M_IX86)
#define _X86_
#elif defined(__arm__) || defined(_M_ARM) || defined(_M_ARMT)
#define _ARM_
#endif
 

Ответ №14:

для меня я использовал glfw и imgui, и я по ошибке включил этот файл заголовка:

 #include <stringapiset.h>
 

Я просто удалил ее, и эта ошибка больше не