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>
Я просто удалил ее, и эта ошибка больше не