Kesalahan fatal: "Tidak Ada Arsitektur Target" di Visual Studio

98

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.

philipvr
sumber
Bagaimana cara menetapkan arsitektur target untuk proyek saya?
philipvr
Proyek vanilla tidak gagal dengan cara ini. Apa yang Anda ubah dari proyek vanilla? Apa yang ada di baris 135 dari winnt.h? Pernahkah Anda melihat baris file header itu. Pesan kesalahan memberi Anda bantuan.
David Heffernan
Anda harus bisa menyelesaikannya dari sini; mungkin perlu kembali sebelum baris 127 untuk mendapatkan gambaran lengkapnya. Tampak jelas bahwa Edwin benar.
David Heffernan
Coba proyek msvs baru (dummy) dan salin-seret sumber Anda ke dalamnya. Cobalah untuk mengkompilasinya dan jika ya, bandingkan dengan proyek asli Anda. BTW tidak menyalin stdafx. *
engf-010
Kedengarannya buruk. Tetapi sebelum Anda melakukan penginstalan ulang, Anda dapat mencobanya terlebih dahulu dengan solusi baru dan jika tidak berhasil, Anda dapat menginstal ulang project = template secara manual (google itu).
engf-010

Jawaban:

148

Gunakan #include <windows.h>sebagai ganti #include <windef.h>.

Dari windows.hhalaman wikipedia:

Ada sejumlah file header anak yang secara otomatis disertakan dengan windows.h. Banyak dari file ini tidak dapat disertakan sendiri (tidak mandiri ), karena ketergantungan.

windef.hadalah salah satu file yang otomatis disertakan dengan windows.h.

philipvr
sumber
Saya memang memikirkan itu, tetapi saya tidak dapat membayangkan bahwa Anda tidak menyertakan windows.h.
engf-010
1
windows.h mendefinisikan alkinds dari definisi lain berdasarkan compiler-switch dan menyertakan banyak WINAPI-headers, beberapa di antaranya tergantung pada hal-hal yang ditentukan oleh windows.h.
engf-010
selamat, Anda telah memperbaiki masalah Anda dan Anda memiliki perwakilan yang cukup untuk memilih!
David Heffernan
1
Baik windows.h maupun windowsx.h (saya berasumsi keduanya sama tetapi tetap mencoba keduanya) membantu dengan itu #error Hey man you gotta choose a target.. Apa lagi yang bisa memperbaikinya?
rsethc
Perhatian: tampaknya termasuk Xinput.h sebelum Windows.h menyebabkan ini juga.
Jens Åkerblom
25

Penyebab lain dari ini dapat termasuk header yang bergantung pada windows.h, sebelum disertakanwindows.h .

Dalam kasus saya, saya menyertakan xinput.hsebelumnya windows.hdan mendapatkan kesalahan ini. Menukar pesanan menyelesaikan masalah.

Nathan Reed
sumber
4
Persis solusi saya! Terima kasih telah menyelamatkan saya dari rasa frustrasi selama berjam-jam.
Acidic9
5

_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?

engf-010
sumber
Haruskah lebih _WIN32baik daripada WIN32? Ini bukan bidang keahlian saya, tetapi mengingat tajuknya mencari _WIN64, '_AMD64_` dll. Tampaknya masuk akal.
David Heffernan
@ David Heffernan: pada baris perintah tertulis WIN32 (no _) bahkan untuk x84. Tidak tahu alasannya (tapi siapa yang mengerti MS)
engf-010
4
@Edwin x84? Apakah itu komputer George Orwell?
David Heffernan
@David Heffernan: ya, kakak mengawasi saya! (jelas maksud saya x64)
engf-010
Dalam kasus saya _WIN32 telah ditentukan dan merupakan pelakunya. Saya sedang membangun untuk x64. Jawaban Anda membuat saya berada di jalur yang benar. Kerja bagus!
Herve Mutombo
4

Tampaknya itu _AMD64_tidak ditentukan, karena saya tidak dapat membayangkan Anda sedang mengompilasi untuk Itanium ( _IA64_).

David Heffernan
sumber
AMD64 akan ditentukan dalam beberapa kondisi: #if! Ditentukan ( 68K ) &&! Ditentukan ( MPPC ) &&! Ditentukan ( X86 ) &&! Ditentukan ( IA64 ) &&! Ditentukan ( AMD64 ) && ditentukan (_M_AMD64)
engf-010
@ Edwin Jika _AMD64_atau _IA64_telah ditentukan, maka dia tidak akan mendapatkan kesalahan. Itulah yang dikatakan file header.
David Heffernan
philipvr telah memperbarui postingannya. Dia punya masalah lain (lebih). Dia berpikir untuk menginstal ulang MSVS.
engf-010
3

Selesaikan dengan menempatkan file include dan definisi berikut terlebih dahulu:

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

#include <windows.h>
Michael Haephrati
sumber
Ini memperbaiki build x86 dan x64 saya. Saya perlu menambahkan baris ini sebelumnya #include <WinUser.h>.
Jonathan Lidbeck
2

Pada awal file yang Anda kompilasi, sebelum ada include, coba letakkan SALAH SATU baris ini

#define _X86_
#define _AMD64_
#define _ARM_

Pilih yang sesuai, hanya satu, tergantung pada arsitektur Anda.

Andrea Araldo
sumber
2

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.

Melardev
sumber
1

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.

Laurie Stearn
sumber
Kunjungan lain ke halaman ini muncul saat proyek lama kebetulan memiliki `#include <synchapi.h>` di header CriticalSection.
Laurie Stearn
1

Saya punya masalah serupa. Dalam kasus saya, saya tidak sengaja memasukkan winuser.hsebelumnya windows.h(sebenarnya, ekstensi IDE buggy telah menambahkannya). Menghapus winuser.hmemecahkan masalah.

MxNx
sumber
1
Bagi saya ReSharper menambahkanconsoleapi2.h
SWdV
1

Selain penyebab yang sudah dijelaskan, saya menerima kesalahan ini karena saya menyertakan:

#include <fileapi.h>

Rupanya itu tidak diperlukan (meskipun ada panggilan CreateDirectoryW). Setelah berkomentar, kompiler senang. Sangat aneh.

Shital Shah
sumber
0

Jika Anda membangun 32bit, pastikan Anda tidak menentukan _WIN64 untuk proyek Anda.

Brian
sumber