ข้อผิดพลาดร้ายแรง:“ ไม่มีสถาปัตยกรรมเป้าหมาย” ใน Visual Studio


100

เมื่อฉันพยายามรวบรวมโครงการ 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 คืออะไร? คุณเคยดูบรรทัดของไฟล์ส่วนหัวนั้นหรือยัง ข้อความแสดงข้อผิดพลาดกำลังให้ความช่วยเหลือแก่คุณ
David Heffernan

คุณควรจะสามารถแก้ไขได้จากที่นี่ อาจต้องย้อนกลับไปก่อนบรรทัด 127 ถึงจะได้ภาพเต็ม ดูเหมือนว่าเอ็ดวินจะถูกต้อง
David Heffernan

ลองใช้โปรเจ็กต์ msvs ใหม่ (ดัมมี่) แล้วคัดลอกลากแหล่งข้อมูลของคุณไป พยายามรวบรวมและถ้าเป็นเช่นนั้นให้เปรียบเทียบกับโครงการเดิมของคุณ BTW ห้ามคัดลอก stdafx *
engf-010

ฟังดูไม่ดี แต่ก่อนที่คุณจะติดตั้งใหม่คุณสามารถลองใช้โซลูชันใหม่ก่อนและหากไม่ได้ผลคุณสามารถติดตั้งเทมเพลต project = ใหม่ด้วยตนเอง (google it)
engf-010

คำตอบ:


158

ใช้#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

ขอแสดงความยินดีคุณได้แก้ไขปัญหาของคุณแล้วและคุณมีตัวแทนเพียงพอที่จะลงคะแนน!
David Heffernan

1
ทั้ง windows.h ไม่ windowsx.h (ผมถือว่าพวกเขาเป็นสิ่งเดียวกัน แต่มีความพยายามทั้งสองต่อไป) #error Hey man you gotta choose a target.ความช่วยเหลือเกี่ยวกับว่า มีอะไรอีกที่สามารถแก้ไขได้?
rsethc

โปรดทราบ: ดูเหมือนว่าจะรวมถึง Xinput.h ก่อนหน้า Windows.h ด้วยเช่นกัน
Jens Åkerblom

26

สาเหตุของการนี้ก็สามารถรวมทั้งส่วนหัวที่ขึ้นอยู่กับก่อนที่จะรวมถึงwindows.hwindows.h

ในกรณีของฉันฉันรวมไว้xinput.hก่อนwindows.hและได้รับข้อผิดพลาดนี้ การสลับลำดับช่วยแก้ปัญหาได้


5
ทางออกของฉันเป๊ะ! ขอบคุณที่ช่วยฉันได้หลายชั่วโมง
Acidic9

5

ไม่ได้กำหนดตัวระบุ _WIN32

ใช้ #include <SDKDDKVer.h>

MSVS โครงการสร้างห่อนี้ ได้แก่ โดยการสร้างท้องถิ่น"targetver.h"ซึ่งรวมอยู่โดย"stdafx.h"ที่ comiled เป็น precompiled "stdafx.cpp"หัวผ่าน

แก้ไข: คุณมี a / D "WIN32" ในบรรทัดคำสั่งของคุณหรือไม่?


มันควรจะเป็น_WIN32มากกว่าWIN32? ไม่ใช่พื้นที่ที่ฉันเชี่ยวชาญ แต่เนื่องจากส่วนหัวกำลังมองหา_WIN64"_AMD64_` เป็นต้นจึงดูเหมือนจะเป็นไปได้
David Heffernan

@David Heffernan: ที่ commandline จะระบุว่า WIN32 (ไม่ _) แม้แต่สำหรับ x84 ไม่รู้เหตุผลของมัน (แต่ใครจะเข้าใจ MS)
engf-010

4
@ เอ็ดวิน x84? นั่นคือคอมพิวเตอร์ของ George Orwell หรือไม่?
David Heffernan

@David Heffernan: ใช่พี่ใหญ่กำลังดูฉันอยู่! (ชัด x64 ฉันหมายถึง)
engf-010

ในกรณีของฉัน _WIN32 ถูกกำหนดและเป็นผู้กระทำผิด ฉันกำลังสร้าง x64 คำตอบของคุณทำให้ฉันตามทัน เก่งมาก!
Herve Mutombo

5

หากคุณใช้ Resharper ตรวจสอบให้แน่ใจว่าไม่ได้เพิ่มส่วนหัวที่ผิดสำหรับคุณกรณีที่พบบ่อยมากกับ ReSharper ได้แก่

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

อัปเดต :
คำแนะนำอีกประการหนึ่งคือตรวจสอบว่าคุณใส่ "Windows.h บางส่วน" ไว้หรือไม่สิ่งที่ฉันหมายถึงคือถ้าคุณรวมเช่น winbase.h หรือ minwindef.h คุณอาจพบข้อผิดพลาดนั้นให้เพิ่ม "the big" Windows .h แทน นอกจากนี้ยังมีบางกรณีที่ชัดเจนน้อยกว่าที่ฉันทำสิ่งที่น่าสังเกตที่สุดคือเมื่อฉันรวมเฉพาะ synchapi.h เอกสารระบุอย่างชัดเจนว่าเป็นส่วนหัวที่จะรวมสำหรับบางฟังก์ชันเช่น AcquireSRWLockShared แต่มันทริกเกอร์ไม่มีสถาปัตยกรรมเป้าหมายการแก้ไข คือการลบ synchapi.h และรวม Windows.h "ตัวใหญ่"

Windows.h มีขนาดใหญ่มันกำหนดมาโคร (หลายตัวลบข้อผิดพลาด No target arch) และรวมถึงส่วนหัวอื่น ๆ อีกมากมาย โดยสรุปให้ตรวจสอบเสมอว่าคุณใส่ส่วนหัวบางส่วนที่สามารถแทนที่ด้วย Windows.hได้หรือไม่เพราะไม่แปลกที่จะรวมส่วนหัวที่อาศัยค่าคงที่ที่กำหนดโดย Windows.h ดังนั้นหากคุณไม่รวมส่วนหัวนี้ การรวบรวมอาจล้มเหลว


4

ดูเหมือน_AMD64_จะไม่ได้กำหนดไว้เนื่องจากฉันนึกไม่ถึงว่าคุณกำลังรวบรวม Itanium ( _IA64_)


AMD64จะถูกกำหนดภายใต้เงื่อนไขบางประการ: #if! กำหนด ( 68K ) &&! กำหนด ( MPPC ) &&! กำหนด ( X86 ) &&! กำหนด ( IA64 ) &&! กำหนด ( AMD64 ) && กำหนด (_M_AMD64)
engf-010

@Edwin ถ้า_AMD64_หรือ_IA64_ถูกกำหนดเขาจะไม่ได้รับข้อผิดพลาด นั่นคือสิ่งที่ไฟล์ส่วนหัวระบุ
David Heffernan

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>ฉันต้องการที่จะเพิ่มบรรทัดเหล่านี้ก่อน
Jonathan Lidbeck

2

ฉันมีปัญหาที่คล้ายกัน ในกรณีของฉันฉันได้รวมไว้winuser.hก่อนหน้านี้โดยไม่ได้ตั้งใจwindows.h(จริงๆแล้วมีการเพิ่มส่วนขยาย IDE ของรถบั๊กกี้) การลบการwinuser.hแก้ไขปัญหา


1
สำหรับฉัน ReSharper เพิ่มconsoleapi2.h
SWdV

2

นอกจากสาเหตุที่อธิบายไว้แล้วฉันได้รับข้อผิดพลาดนี้เพราะฉันรวมถึง:

#include <fileapi.h>

เห็นได้ชัดว่ามันไม่จำเป็น (แม้จะมีการเรียก CreateDirectoryW) หลังจากแสดงความคิดเห็นคอมไพเลอร์ก็มีความสุข ที่แปลกมาก.


ฉันมีสถานการณ์เดียวกัน
JOE

2

ที่จุดเริ่มต้นของไฟล์ที่คุณกำลังรวบรวมก่อนอื่นincludeให้ลองใส่หนึ่งในบรรทัดเหล่านี้

#define _X86_
#define _AMD64_
#define _ARM_

เลือกสิ่งที่เหมาะสมเพียงอย่างเดียวขึ้นอยู่กับสถาปัตยกรรมของคุณ


1

อีกสาเหตุหนึ่งของข้อผิดพลาด (ท่ามกลางข้อผิดพลาดอื่น ๆ อีกมากมายที่ตัดขึ้นเมื่อเปลี่ยนการสร้างเป้าหมายของโครงการ Win32 เป็น X64) ไม่ได้ติดตั้งคอมไพเลอร์ C ++ 64 บิตตามที่ระบุไว้ที่ด้านบนของหน้านี้
เพิ่มเติมความคิดเห็น philipvr บนส่วนหัวของเด็ก (ในกรณีของฉัน) ชัดเจนรวมของwinnt.hเป็นที่ไม่จำเป็นเมื่อwindows.hถูกนำมาใช้


การเยี่ยมชมหน้านี้อีกครั้งเกิดขึ้นเมื่อโครงการเก่าเกิดขึ้นที่มี `#include <synchapi.h>` ในส่วนหัว CriticalSection
Laurie Stearn

0

หากคุณกำลังสร้าง 32 บิตตรวจสอบให้แน่ใจว่าคุณไม่ได้กำหนด _WIN64 สำหรับโครงการของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.