Önemli hata: Visual Studio'da "Hedef Mimari Yok"


100

Win32 veya x64 modunda Visual Studio 2010 kullanarak c ++ projemi derlemeye çalıştığımda aşağıdaki hatayı alıyorum:

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

Önişlemci tanımlarım WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions) diyor

Bu hataya neden olan nedir ve nasıl düzeltebilirim?

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

Güncelleme: Yeni bir msvs projesi oluşturdum ve kodumu ona kopyaladım. Artık sahip değilim error : "No Target Architecture", ancak şimdi winnt.h ve winbase.h ile ilgili bir dizi derleme hatası var ve dosyalarımın hiçbiriyle ilgili derleme hatası yok. Bu dosyaların bozulmuş olması mümkün mü? MSVS 2010'u yeniden yüklemem gerekiyor mu?

Güncelleme 2: Bu yüzden sorunumu daralttım ve bunun #include <WinDef.h>winnt.h ile tüm derleme hatalarıma neden olduğunu buldum ama hala nasıl düzelteceğimi bilmiyorum.


Projem için hedef mimariyi nasıl ayarlarım?
philipvr

Bir vanilya projesi bu şekilde başarısız olmaz. Bir vanilya projesinden neyi değiştirdiniz? Winnt.h satırının 135. satırında ne var? Başlık dosyasının şu satırına baktın mı? Hata mesajı size biraz yardım ediyor.
David Heffernan

buradan çözebilmelisiniz; Resmin tamamını görmek için muhtemelen 127. satırdan önce geri gitmeniz gerekiyor. Edwin'in haklı olduğu açık görünüyor.
David Heffernan

Yeni bir msvs projesi (kukla) deneyin ve kaynaklarınızı kopyalayıp içine sürükleyin. Derlemeye çalışın ve eğer öyleyse, orijinal projenizle karşılaştırın. BTW stdafx'i kopyalamıyor. *
engf-010

Kulağa kötü geliyor. Ancak bir yeniden yükleme yapmadan önce, önce yeni bir çözümle deneyebilirsiniz ve bu işe yaramazsa, proje = şablonlarını (google it) manuel olarak yeniden yükleyebilirsiniz.
engf-010

Yanıtlar:


158

#include <windows.h>Bunun yerine kullanın #include <windef.h>.

Gönderen windows.hwikipedia sayfası:

Otomatik olarak dahil edilen birkaç alt başlık dosyası vardır windows.h. Bu dosyaların çoğu, bağımlılıklar nedeniyle kendi başlarına dahil edilemezler (bağımsız değildirler ).

windef.hotomatik olarak dahil edilen dosyalardan biridir windows.h.


Bunu düşündüm, ancak windows.h'yi eklemediğinizi hayal edemedim.
engf-010

1
windows.h, derleyici anahtarlarına dayalı diğer tanımların alkindlerini tanımlar ve bazıları windows.h tarafından tanımlanan şeylere bağlı olan birçok WINAPI üstbilgisi içerir.
engf-010

tebrikler, sorununuzu sabit ve yukarı oy verecek temsilcisi var!
David Heffernan

1
Ne windows.h ne de windowsx.h (aynı şey olduklarını varsayıyorum ama yine de ikisini de denedim) bu konuda yardımcı olmuyor #error Hey man you gotta choose a target.. Bunu başka ne düzeltebilir?
rsethc

Dikkat: Windows.h'den önce Xinput.h'nin eklenmesi de buna neden oluyor.
Jens Åkerblom

26

Bunun bir başka nedeni windows.h, eklemeden önce bağlı olan bir başlık eklemek olabilir windows.h.

Benim durumumda daha xinput.hönce dahil ettim windows.hve bu hatayı aldım. Sırayı değiştirmek sorunu çözdü.


5
Aynen benim çözümüm! Beni saatler süren hayal kırıklığından kurtardığın için teşekkürler.
Acidic9

5

_WIN32 tanımlayıcı tanımlı değil.

kullanım #include <SDKDDKVer.h>

MSVS tarafından oluşturulan projeler , önceden derlenmiş bir üstbilgi aracılığıyla derlenen bir yerel "targetver.h"oluşturarak bunu içerir ."stdafx.h""stdafx.cpp"

DÜZENLEME: Komut satırınızda / D "WIN32" var mı?


Olması gereken _WIN32ziyade WIN32? Bu benim uzmanlık alanım değil, ancak başlığın _WIN64'_AMD64_` vb. Aradığı düşünüldüğünde makul görünebilir.
David Heffernan

@David Heffernan: komut satırında x84 için bile WIN32 (hayır _) yazıyor. Bunun gerekçesini bilmiyorum (ama MS'i kim anlıyor)
engf-010

4
@Edwin x84? Bu George Orwell'in bilgisayarı mı?
David Heffernan

@David Heffernan: Evet, ağabey beni izliyor! (tabii ki anlamına x64)
engf-010

Benim durumumda _WIN32 tanımlandı ve suçluydu. X64 için inşa ediyordum. Cevabınız beni yoluna koydu. Aferin!
Herve Mutombo

5

Resharper kullanıyorsanız, bunun sizin için yanlış başlık eklemediğinden emin olun, ReSharper ile ilgili çok yaygın durumlar şunlardır:

  • #include <consoleapi2.h
  • #include <apiquery2.h>
  • #include <fileapi.h>

GÜNCELLEME :
Başka bir öneri, "kısmi bir Windows.h" ekleyip eklemediğinizi kontrol etmektir, demek istediğim, örneğin winbase.h veya minwindef.h'yi eklerseniz, bu hatayla sonuçlanabilirsiniz, "büyük" Windows ekleyin .h yerine. Ayrıca geçtiğim bazı daha az belirgin durumlar da var, en dikkate değer olanı yalnızca synchapi.h'yi dahil ettiğim zamandı, dokümanlar AcquireSRWLockShared gibi bazı işlevler için dahil edilecek başlığın olduğunu açıkça belirtiyor, ancak Hedef yok mimarisini, düzeltmeyi tetikledi synchapi.h dosyasını kaldırmak ve "büyük" Windows.h dosyasını dahil etmekti.

Windows.h çok büyüktür, makroları tanımlar (çoğu Hedef yok ark hatasını kaldırır) ve birçok başka başlık içerir. Özet olarak , her zaman Windows.h ile değiştirilebilecek bir başlık ekleyip eklemediğinizi kontrol edin, çünkü Windows.h tarafından tanımlanan bazı sabitlere dayanan bir başlık eklemek alışılmadık bir durum değildir; bu nedenle, bu başlığı dahil edemezseniz, derleme başarısız olabilir.


4

_AMD64_Itanium ( _IA64_) için derlediğinizi hayal edemediğim için bu tanımlanmamış gibi görünüyor .


AMD64 bazı şartlar altında tanımlanacak:! #İf tanımlı ( 68K !) && (tanımlanmış MPPC !) && (tanımlanmış X86 ! (Tanımlanmış) && ıa64 !) && tanımlı ( AMD64 ) && tanımlı (_M_AMD64)
engf-010

@Edwin Eğer _AMD64_veya _IA64_tanımlanmışsa, o zaman hatayı almayacaktır. Başlık dosyası öyle diyor.
David Heffernan

philipvr gönderisini güncelledi. Başka (daha fazla) sorunları var. MSVS'yi yeniden kurmayı düşünüyor.
engf-010

3

Önce aşağıdaki içerme dosyalarını ve tanımı yerleştirerek çözün:

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

#include <windows.h>

Bu hem x86 hem de x64 yapılarımı düzeltti. Bu satırları daha önce eklemem gerekiyordu #include <WinUser.h>.
Jonathan Lidbeck

2

Benzer bir problemim vardı. Benim durumumda, daha winuser.hönce yanlışlıkla dahil etmiştim windows.h(aslında, bir buggy IDE uzantısı eklemişti). winuser.hSorunu ortadan kaldırmak sorunu çözdü.


1
Benim için ReSharper eklendiconsoleapi2.h
SWdV

2

Daha önce açıklanan nedenlerin yanı sıra, bu hatayı aldım çünkü şunları ekleyeceğim:

#include <fileapi.h>

Görünüşe göre buna gerek yoktu (CreateDirectoryW çağrısına rağmen). Yorum yaptıktan sonra derleyici mutlu oldu. Çok ilginç.


Tam olarak aynı duruma sahibim.
JOE

2

Derlemekte olduğunuz dosyanın başlangıcına, her şeyden önce includebu satırlardan BİRİNİ koymaya çalışın.

#define _X86_
#define _AMD64_
#define _ARM_

Mimarinize bağlı olarak uygun olanı seçin.


1

Hatanın bir başka nedeni (bir Win32 projesinin hedef yapısını X64'e değiştirirken ortaya çıkan diğerleri arasında), bu sayfanın üst kısmında belirtildiği gibi C ++ 64 bit derleyicilerin kurulu olmamasıydı .
Ayrıca (benim durumumda) çocuk başlıklarını, açık üzerinde philipvr yorumuna ait dahil winnt.h olmanın gereksiz zaman windows.h kullanılıyordu.


Bu sayfaya başka bir ziyaret, eski bir projenin bir CriticalSection başlığında "#include <synchapi.h>" içerdiğinde ortaya çıktı.
Laurie Stearn

0

32bit inşa ediyorsanız, projeniz için _WIN64 tanımlamadığınızdan emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.