Ketika saya mencoba untuk mengkompilasi proyek c ++ saya menggunakan Visual Studio 2010 baik dalam mode Win32 atau x64 saya mendapatkan kesalahan berikut:
>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(135): fatal error C1189: #error : "No Target Architecture"
Definisi preprocessor saya mengatakan WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)
Apa yang menyebabkan kesalahan ini dan bagaimana cara memperbaikinya?
// 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
Pembaruan: Saya membuat proyek msvs baru dan menyalin kode saya ke sana. Saya tidak lagi memilikinya error : "No Target Architecture"
, tetapi sekarang saya memiliki banyak kesalahan kompilasi yang melibatkan winnt.h dan winbase.h dan tidak ada kesalahan kompilasi yang melibatkan file saya. Apakah mungkin file-file ini rusak? Apakah saya perlu menginstal ulang MSVS 2010?
Pembaruan 2: Jadi saya mempersempit masalah saya dan menemukan bahwa itulah #include <WinDef.h>
yang menyebabkan semua kesalahan kompilasi saya dengan winnt.h tetapi saya masih tidak tahu cara memperbaikinya.
sumber
Jawaban:
Gunakan
#include <windows.h>
sebagai ganti#include <windef.h>
.Dari
windows.h
halaman wikipedia:windef.h
adalah salah satu file yang otomatis disertakan denganwindows.h
.sumber
#error Hey man you gotta choose a target.
. Apa lagi yang bisa memperbaikinya?Penyebab lain dari ini dapat termasuk header yang bergantung pada
windows.h
, sebelum disertakanwindows.h
.Dalam kasus saya, saya menyertakan
xinput.h
sebelumnyawindows.h
dan mendapatkan kesalahan ini. Menukar pesanan menyelesaikan masalah.sumber
_WIN32 pengenal tidak ditentukan.
menggunakan
#include <SDKDDKVer.h>
Proyek yang dihasilkan MSVS membungkus ini termasuk dengan menghasilkan lokal
"targetver.h"
yang disertakan dengan"stdafx.h"
yang dikompilasi menjadi header-precompiled melalui"stdafx.cpp"
.EDIT: apakah Anda memiliki / D "WIN32" pada baris perintah Anda?
sumber
_WIN32
baik daripadaWIN32
? Ini bukan bidang keahlian saya, tetapi mengingat tajuknya mencari_WIN64
, '_AMD64_` dll. Tampaknya masuk akal.Tampaknya itu
_AMD64_
tidak ditentukan, karena saya tidak dapat membayangkan Anda sedang mengompilasi untuk Itanium (_IA64_
).sumber
_AMD64_
atau_IA64_
telah ditentukan, maka dia tidak akan mendapatkan kesalahan. Itulah yang dikatakan file header.Selesaikan dengan menempatkan file include dan definisi berikut terlebih dahulu:
sumber
#include <WinUser.h>
.Pada awal file yang Anda kompilasi, sebelum ada
include
, coba letakkan SALAH SATU baris iniPilih yang sesuai, hanya satu, tergantung pada arsitektur Anda.
sumber
Jika Anda menggunakan Resharper pastikan itu tidak menambahkan header yang salah untuk Anda, kasus yang sangat umum dengan ReSharper adalah:
-
#include <consoleapi2.h
-
#include <apiquery2.h>
PEMBARUAN :
Saran lain adalah untuk memeriksa apakah Anda menyertakan "sebagian Windows.h", yang saya maksud adalah jika Anda menyertakan misalnya winbase.h atau minwindef.h Anda mungkin berakhir dengan kesalahan itu, tambahkan "yang besar" sebagai gantinya Windows.h. Ada juga beberapa kasus yang kurang jelas yang saya alami, yang paling menonjol adalah ketika saya hanya menyertakan synchapi.h, dokumen dengan jelas menyatakan bahwa header yang akan disertakan untuk beberapa fungsi seperti AcquireSRWLockShared tetapi memicu arsitektur Tidak ada target, perbaikannya adalah menghapus synchapi.h dan menyertakan "besar" Windows.h. Windows.h adalah hughe, itu mendefinisikan makro (banyak dari mereka menghapus kesalahan lengkungan Tidak ada target) dan menyertakan banyak header lainnya. Singkatnya , selalu periksa apakah Anda menyertakan beberapa header yang dapat diganti oleh Windows.
sumber
Alasan lain untuk kesalahan (di antara banyak lainnya yang muncul saat mengubah target build dari proyek Win32 ke X64) adalah tidak adanya kompiler C ++ 64 bit yang diinstal seperti yang disebutkan di bagian atas halaman ini .
Selanjutnya untuk komentar philipvr tentang header anak, (dalam kasus saya) menyertakan eksplisit winnt.h yang tidak diperlukan ketika windows.h sedang digunakan.
sumber
Saya punya masalah serupa. Dalam kasus saya, saya tidak sengaja memasukkan
winuser.h
sebelumnyawindows.h
(sebenarnya, ekstensi IDE buggy telah menambahkannya). Menghapuswinuser.h
memecahkan masalah.sumber
consoleapi2.h
Selain penyebab yang sudah dijelaskan, saya menerima kesalahan ini karena saya menyertakan:
Rupanya itu tidak diperlukan (meskipun ada panggilan CreateDirectoryW). Setelah berkomentar, kompiler senang. Sangat aneh.
sumber
Jika Anda membangun 32bit, pastikan Anda tidak menentukan _WIN64 untuk proyek Anda.
sumber