घातक त्रुटि: विजुअल स्टूडियो में "नो टार्गेट आर्किटेक्चर"


96

जब मैं विजुअल स्टूडियो 2010 में Win32 या x64 मोड का उपयोग करके अपने c ++ प्रोजेक्ट को संकलित करने का प्रयास करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है:

>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(135): fatal error C1189: #error : "No Target Architecture"

मेरी प्रीप्रोसेसर परिभाषाएँ Win32; _DEBUG; _CONSOLE;% (PreprocessorDefititions) कहती हैं।

इस त्रुटि के कारण क्या है और मैं इसे कैसे ठीक करूं?

// 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

अपडेट: मैंने एक नई एमएसवीएस परियोजना बनाई और उसमें अपना कोड कॉपी किया। मेरे पास अब नहीं है error : "No Target Architecture", लेकिन अब मेरे पास winnt.h और winbase.h को संकलित त्रुटियों का एक गुच्छा है और मेरी फ़ाइलों में से किसी को भी संकलित करने में कोई त्रुटि नहीं है। क्या यह संभव है कि ये फाइलें दूषित हैं? क्या मुझे MSVS 2010 को फिर से स्थापित करने की आवश्यकता है?

अद्यतन 2: इसलिए मैंने अपनी समस्या को कम कर दिया और पाया कि यह वह है #include <WinDef.h>जो मेरी सभी संकलित त्रुटियों को winnt.h के साथ पैदा कर रहा है, लेकिन मुझे अभी भी नहीं पता कि इसे कैसे ठीक किया जाए।


मैं अपनी परियोजना के लिए लक्ष्य वास्तुकला कैसे निर्धारित करूं?
दलीपपर्व ३०'११

एक वेनिला परियोजना इस तरह विफल नहीं होती है। क्या आप एक वेनिला परियोजना से बदल गए हैं? Winnt.h की लाइन 135 पर क्या है? क्या आपने हेडर फ़ाइल की उस लाइन को भी देखा है। त्रुटि संदेश आपको कुछ मदद दे रहा है।
डेविड हेफर्नन

आपको यहां से काम करने में सक्षम होना चाहिए; शायद पूरी तस्वीर लेने के लिए लाइन 127 से पहले वापस जाने की जरूरत है। यह स्पष्ट प्रतीत होगा कि एडविन सही थे।
डेविड हेफर्नन

एक नया msvs प्रोजेक्ट (डमी) आज़माएं और उसमें अपने स्रोतों को कॉपी-ड्रैग करें। इसे संकलित करने का प्रयास करें और यदि ऐसा होता है, तो अपनी मूल परियोजना के साथ तुलना करें। BTW stdafx की नकल नहीं करते। *
engf-010

बुरा लगता है। लेकिन इससे पहले कि आप फिर से स्थापित करें, आप पहले इसे एक नए समाधान के साथ आज़मा सकते हैं और यदि यह काम नहीं करता है तो आप प्रोजेक्ट = टेम्प्लेट्स को फिर से स्थापित कर सकते हैं (इसे गूगल करें)।
engf-010

जवाबों:


146

के #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

हेड अप्स: लगता है कि Windows.h से पहले भी यह शिनपुट को शामिल करता है।
जेन्स Jकेब्लम २

24

इसका एक अन्य कारण एक हेडर शामिल हो सकता है जो कि निर्भर करता है windows.h, जिसमें शामिल हैwindows.h

मेरे मामले में मैंने xinput.hपहले शामिल किया windows.hऔर यह त्रुटि मिली। ऑर्डर स्वैप करने से समस्या हल हो गई।


4
बिल्कुल मेरे समाधान! मुझे हताशा के घंटे बचाने के लिए धन्यवाद।
एसिडिक

5

_WIN32 पहचानकर्ता परिभाषित नहीं है।

उपयोग #include <SDKDDKVer.h>

MSVS जेनरेट की गई परियोजनाओं में यह "targetver.h"शामिल है "stdafx.h"कि इसमें स्थानीय को उत्पन्न करके शामिल किया गया है जो कि इसमें शामिल है जिसे एक प्री-कम्पाइल-हेडर के माध्यम से तैयार किया गया है "stdafx.cpp"

संपादित करें: क्या आपके पास अपनी कमांडलाइन पर / D "WIN32" है?


इसके _WIN32बजाय होना चाहिए WIN32? यह मेरी विशेषज्ञता का क्षेत्र नहीं है, लेकिन यह देखते हुए कि हेडर _WIN64'_AMD64_` आदि की तलाश में है , यह प्रशंसनीय प्रतीत होगा।
डेविड हेफर्नन

@ डेविड हेफर्नन: कमांडलाइन पर यह x 32 के लिए भी Win32 (नहीं _) कहता है। इसका औचित्य नहीं जानते (लेकिन जो एमएस को समझता है)
engf-010

4
@ ईडविन x84? क्या वह जॉर्ज ऑरवेल का कंप्यूटर है?
डेविड हेफर्नन

@ डेविड हेफर्नन: हाँ, बड़े भाई मुझे देख रहे हैं! (जाहिर है x64 मेरा मतलब है)
engf-010

मेरे मामले में _W32 को परिभाषित किया गया था और वह अपराधी था। मैं x64 के लिए निर्माण कर रहा था। आपके जवाब ने मुझे पटरी पर ला दिया। बहुत बढ़िया!
हरवे मुतम्बो

4

ऐसा लगता है कि _AMD64_यह परिभाषित नहीं है, क्योंकि मैं कल्पना नहीं कर सकता कि आप इटेनियम ( _IA64_) के लिए संकलन कर रहे हैं ।


AMD64 कुछ शर्तों के तहत परिभाषित किया जाएगा: #if परिभाषित ( 68K !) && परिभाषित ( MPPC !) && परिभाषित ( X86 !) && परिभाषित ( IA64 !) && परिभाषित ( AMD64 ) && परिभाषित (_M_AMD64)
engf-010

@Edwin हैं _AMD64_या _IA64_परिभाषित किया गया था, तो वह त्रुटि मिल रही है नहीं होगा। हैडर फ़ाइल जो कहती है।
डेविड हेफर्नन

फिलीपर्व ने अपनी पोस्ट अपडेट की है। उसे अन्य (अधिक) समस्याएं हैं। वह MSVS को फिर से स्थापित करने के बारे में सोच रहा है।
21:49 बजे eng-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 शामिल हैं। तो आप उस त्रुटि को समाप्त कर सकते हैं, इसके बजाय "बड़ा" जोड़ें windows.h। कुछ कम स्पष्ट मामले भी हैं जिनसे मैं गुज़रा, सबसे उल्लेखनीय था जब मैंने केवल synchapi.h को शामिल किया था, डॉक्स स्पष्ट रूप से बताता है कि AcquireSRWLockSared जैसे कुछ फ़ंक्शंस में शामिल होने के लिए शीर्षलेख है, लेकिन यह कोई लक्ष्य आर्किटेक्चर ट्रिगर नहीं करता है, फिक्स synchapi.h को हटाने और "बड़ा" Windows.h शामिल करने के लिए था। Windows.h hughe है, यह मैक्रोज़ को परिभाषित करता है (उनमें से कई नो टारगेट आर्क त्रुटि को हटाते हैं) और कई अन्य हेडर शामिल हैं। सारांश में , हमेशा जांचें कि क्या आप कुछ हेडर शामिल हैं जिन्हें विंडोज द्वारा प्रतिस्थापित किया जा सकता है।


1

त्रुटि का एक और कारण (कई अन्य लोगों के बीच जो Win32 परियोजना के लक्ष्य निर्माण को X64 में बदलते समय क्रॉप किया गया था) इस पृष्ठ के शीर्ष पर उल्लेखित C ++ 64 बिट संकलक स्थापित नहीं किया गया था ।
इसके अलावा बच्चे के हेडर, (मेरे मामले में) एक स्पष्ट पर philipvr की टिप्पणी के शामिल winnt.h किया जा रहा अनावश्यक जब windows.h इस्तेमाल किया जा रहा था।


इस पृष्ठ पर एक और यात्रा तब हुई जब एक पुराने प्रोजेक्ट में क्रिटिसिफ़लेशन हेडर में `#include <synchapi.h>` हुआ।
लॉरी स्टर्न

1

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। मेरे मामले में, मैंने गलती winuser.hसे पहले शामिल किया था windows.h(वास्तव में, एक छोटी गाड़ी आईडीई एक्सटेंशन ने इसे जोड़ा था)। निकाला जा रहा है winuser.hसमस्या हल हो।


1
मेरे लिए ReSharper गयीconsoleapi2.h
SWDV

1

पहले से वर्णित कारणों के अलावा, मुझे यह त्रुटि मिली क्योंकि मैं शामिल करूंगा:

#include <fileapi.h>

जाहिरा तौर पर इसकी जरूरत नहीं थी (CreateDirectoryW कॉल के बावजूद)। बाहर टिप्पणी करने के बाद, कंपाइलर खुश था। बहुत अजीब।


0

यदि आप 32 बिट का निर्माण कर रहे हैं, तो सुनिश्चित करें कि आपके पास अपने प्रोजेक्ट के लिए _WIN64 परिभाषित नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.