Фатальна помилка: "Без цільової архітектури" у Visual Studio


96

Коли я намагаюся скомпілювати проект 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 (манекен) та скопіюйте в нього свої джерела. Спробуйте скласти його, і якщо це станеться, порівняйте його з початковим проектом. BTW не копіює stdafx. *
engf-010

Це погано звучить Але перш ніж повторно встановити, спершу ви можете спробувати його з новим рішенням, і якщо це не працює, ви можете вручну перевстановити проект = шаблони (google it).
engf-010

Відповіді:


146

Використовуйте #include <windows.h>замість #include <windef.h>.

На windows.hсторінці вікіпедії:

Існує ряд дочірніх файлів заголовків, які автоматично додаються до windows.h. Багато з цих файлів не можуть бути просто включені самостійно (вони не є самостійними ) через залежності.

windef.h- це один із файлів, з яким автоматично входить windows.h.


Я думав про це, але не міг уявити, що ви не включили windows.h.
engf-010

1
windows.h визначає alkinds інших визначень на основі компіляторів-перемикачів і включає в себе багато заголовків WINAPI, деякі з яких залежать від речей, визначених windows.h.
engf-010

вітаємо, ви вирішили свою проблему і у вас є достатня кількість представників, щоб проголосувати!
Девід Геффернан

1
Ні Windows.h, ні Windowsx.h (я вважаю, що це одне і те ж, але все одно спробував обидва) не допомагають у цьому #error Hey man you gotta choose a target.. Що ще могло це виправити?
rsethc

Голова вгору: здається, включаючи Xinput.h до того, як Windows.h також спричинить це.
Йенс Окерблом

24

Ще однією причиною цього може бути включення заголовка, від якого залежить windows.h, перед включенням windows.h.

У моєму випадку я включив xinput.hраніше windows.hі отримав цю помилку. Обмін замовлення вирішив проблему.


4
Саме моє рішення! Дякуємо, що врятували мені години розчарування.
Acidic9

5

_WIN32 ідентифікатор не визначений.

використання #include <SDKDDKVer.h>

Проекти, згенеровані MSVS, включають це, генеруючи локальну, "targetver.h"яка включена до того, "stdafx.h"що складається в заздалегідь складений заголовок "stdafx.cpp".

EDIT: у вас є / D "WIN32" у вашому командному рядку?


Чи має бути, _WIN32а не WIN32? Це не моя область знань, але враховуючи, що заголовок шукає _WIN64, "_AMD64_" тощо., Це здасться правдоподібним.
Девід Геффернан

@David Heffernan: у командному рядку написано WIN32 (немає _) навіть для x84. Не знаю обґрунтування цього (але хто розуміє MS)
engf-010

4
@Edwin x84? Це комп’ютер Джорджа Оруелла?
Девід Геффернан

@David Heffernan: так, старший брат дивиться на мене! (очевидно x64 я мав на увазі)
engf-010

У моєму випадку _WIN32 був визначений і був винуватцем. Я будував для x64. Ваша відповідь привела мене в шлях. Хороша робота!
Herve Mutombo

4

Здавалося б, _AMD64_це не визначено, оскільки я не уявляю, що ви компілюєте для Itanium ( _IA64_).


AMD64 буде визначено за певних умов: # якщо! Визначено ( 68K ) &&! Визначено ( MPPC ) &&! Визначено ( X86 ) &&! Визначено ( IA64 ) &&! Визначено ( AMD64 ) && визначено (_M_AMD64)
engf-010

@Edwin Якби _AMD64_або _IA64_було визначено, то він не отримав би помилки. Ось що говорить файл заголовка.
Девід Хеффернан,

philipvr оновив свою посаду. У нього є інші (більше) проблеми. Він думає перевстановити MSVS.
engf-010

3

Вирішіть це, розмістивши спочатку такі файли включення та визначення:

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

#include <windows.h>

Це виправило як мої збірки x86, так і x64. Мені потрібно було додати ці рядки раніше #include <WinUser.h>.
Джонатан Лідбек

2

На початку файлу, який ви компілюєте include, спробуйте додати до цього один із цих рядків

#define _X86_
#define _AMD64_
#define _ARM_

Виберіть відповідний, лише один, залежно від вашої архітектури.


2

Якщо ви використовуєте Resharper, переконайтесь, що він не додає неправильний для вас заголовок, дуже поширеними випадками ReSharper є:
- #include <consoleapi2.h
-#include <apiquery2.h>

ОНОВЛЕННЯ :
Ще одна пропозиція - перевірити, чи включаєте ви "частковий Windows.h", маю на увазі, що якщо ви включите, наприклад, winbase.h або minwindef.h, у вас може з’явитися ця помилка, замість цього додайте "великий" Windows.h. Є також менш очевидні випадки, через які я пройшов, найбільш помітним було, коли я включив лише synchapi.h, у документах чітко зазначено, що це заголовок, який слід включити для деяких функцій, таких як AcquireSRWLockShared, але це викликало відсутність цільової архітектури, виправлення було видалити synchapi.h і включити "великий" Windows.h. Windows.h є hughe, він визначає макроси (багато з них видаляють помилку без цільової арки) і включає багато інших заголовків. Підсумовуючи це , завжди перевіряйте, чи включаєте ви заголовок, який міг би замінити Windows.


1

Ще однією причиною помилки (серед багатьох інших, які з'явилися під час зміни цільової збірки проекту Win32 на X64), було не встановлення компіляторів 64 + біт C ++, як зазначено вгорі цієї сторінки .
На додаток до коментаря philipvr щодо дитячих заголовків, (у моєму випадку) явне враження, що winnt.h є непотрібним, коли Windows.h використовувався.


Черговий візит на цю сторінку стався, коли старий проект мав у заголовку CriticalSection "#include <synchapi.h>".
Laurie Stearn

1

У мене була схожа проблема. У моєму випадку я випадково включив winuser.hраніше windows.h(насправді додав розширений IDE-розширення). Видалення winuser.hвирішеної проблеми.


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

1

Окрім причин, які вже були описані, я отримав цю помилку, тому що я включу:

#include <fileapi.h>

Очевидно, це не було потрібно (незважаючи на виклик CreateDirectoryW). Після коментарів компілятор залишився задоволений. Дуже дивно.


0

Якщо ви будуєте 32-бітний, то переконайтеся, що у вашому проекті не визначено _WIN64.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.