Lỗi nghiêm trọng: “Không có kiến ​​trúc mục tiêu” trong Visual Studio


96

Khi tôi cố gắng biên dịch dự án c ++ của mình bằng Visual Studio 2010 ở chế độ Win32 hoặc x64, tôi gặp lỗi sau:

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

Định nghĩa tiền xử lý của tôi nói WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)

Điều gì gây ra lỗi này và làm thế nào để tôi sửa chữa nó?

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

Cập nhật: Tôi đã tạo một dự án msvs mới và sao chép mã của mình vào đó. Tôi không còn mắc phải nữa error : "No Target Architecture", nhưng bây giờ tôi có một loạt lỗi biên dịch liên quan đến winnt.h và winbase.h và không có lỗi biên dịch nào liên quan đến bất kỳ tệp nào của tôi. Có thể những tệp này bị hỏng? Tôi có cần cài đặt lại MSVS 2010 không?

Cập nhật 2: Vì vậy, tôi đã thu hẹp vấn đề của mình và nhận thấy rằng nó #include <WinDef.h>đang gây ra tất cả các lỗi biên dịch của tôi với winnt.h nhưng tôi vẫn không biết cách khắc phục nó.


Làm cách nào để đặt kiến ​​trúc mục tiêu cho dự án của tôi?
philipvr

Một dự án vani không thất bại theo cách này. Bạn đã thay đổi điều gì từ một dự án vani? Dòng 135 của winnt.h là gì? Bạn thậm chí đã nhìn vào dòng đó của tệp tiêu đề. Thông báo lỗi cung cấp cho bạn một số trợ giúp.
David Heffernan

bạn sẽ có thể giải quyết nó từ đây; có lẽ cần phải quay lại trước dòng 127 để có được hình ảnh đầy đủ. Rõ ràng là Edwin đã đúng.
David Heffernan

Hãy thử một dự án msvs mới (giả) và sao chép-kéo các nguồn của bạn vào đó. Cố gắng biên dịch nó và nếu có, hãy so sánh nó với dự án ban đầu của bạn. BTW không sao chép stdafx *.
engf-010

Nghe có vẻ tệ. Nhưng trước khi thực hiện cài đặt lại, trước tiên bạn có thể thử nó với một giải pháp mới và nếu điều đó không hiệu quả, bạn có thể cài đặt lại dự án = mẫu theo cách thủ công (google nó).
engf-010,

Câu trả lời:


146

Sử dụng #include <windows.h>thay vì #include <windef.h>.

Từ windows.htrang wikipedia:

Có một số tệp tiêu đề con được tự động đưa vào windows.h. Nhiều tệp trong số này không thể đơn giản được bao gồm bởi chính chúng (chúng không phải là tệp độc lập ), vì phụ thuộc.

windef.hlà một trong những tệp được tự động đưa vào windows.h.


Tôi đã nghĩ đến điều đó, nhưng tôi không thể hình dung rằng bạn không bao gồm windows.h.
engf-010,

1
windows.h định nghĩa các loại định nghĩa khác dựa trên các công tắc biên dịch và bao gồm nhiều tiêu đề WINAPI, một số trong số đó tùy thuộc vào những thứ được định nghĩa bởi windows.h.
engf-010,

xin chúc mừng, bạn đã khắc phục được sự cố của mình bạn có đủ đại diện để bỏ phiếu!
David Heffernan

1
Cả windows.h không windowsx.h (tôi cho rằng chúng giống nhau nhưng dù sao cũng đã thử cả hai) giúp bạn với điều đó #error Hey man you gotta choose a target.. Điều gì khác có thể khắc phục điều đó?
rsethc

Cảnh báo: dường như bao gồm Xinput.h trước khi Windows.h cũng gây ra điều này.
Jens Åkerblom

24

Một nguyên nhân khác của điều này có thể là bao gồm tiêu đề phụ thuộc vào windows.h, trước khi bao gồm windows.h.

Trong trường hợp của tôi, tôi đã bao gồm xinput.htrước đây windows.hvà gặp lỗi này. Trao đổi thứ tự đã giải quyết được vấn đề.


4
Chính xác là giải pháp của tôi! Cảm ơn vì đã tiết kiệm cho tôi hàng giờ thất vọng.
Acidic9

5

_ Mã định danh WIN32 không được xác định.

sử dụng #include <SDKDDKVer.h>

Các dự án do MSVS tạo ra bao gồm việc này bằng cách tạo ra một cục bộ "targetver.h"được bao gồm bởi "stdafx.h"nó được đưa vào một tiêu đề được biên dịch trước "stdafx.cpp".

CHỈNH SỬA: bạn có / D "WIN32" trên dòng lệnh của mình không?


Có nên _WIN32hơn WIN32không? Đó không phải là lĩnh vực chuyên môn của tôi, nhưng với tiêu đề đang tìm kiếm _WIN64, '_AMD64_`, v.v. thì có vẻ hợp lý.
David Heffernan

@David Heffernan: ở dòng lệnh có ghi WIN32 (không _) ngay cả đối với x84. Không biết lý do của nó (nhưng ai hiểu MS)
engf-010

4
@Edwin x84? Đó có phải là máy tính của George Orwell không?
David Heffernan

@David Heffernan: vâng, đại ca đang theo dõi tôi! (rõ ràng x64 i nghĩa)
engf-010

Trong trường hợp của tôi, _WIN32 đã được xác định và là thủ phạm. Tôi đang xây dựng cho x64. Câu trả lời của bạn đưa tôi đi đúng hướng. Làm tốt lắm!
Herve Mutombo,

4

Có vẻ như điều đó _AMD64_không được xác định, vì tôi không thể tưởng tượng bạn đang biên dịch cho Itanium ( _IA64_).


AMD64 sẽ được xác định theo một số điều kiện: #if! Define ( 68K ) &&! Define ( MPPC ) &&! Define ( X86 ) &&! Define ( IA64 ) &&! Define ( AMD64 ) && define (_M_AMD64)
engf-010

@Edwin Nếu _AMD64_hoặc _IA64_đã được xác định, thì anh ta sẽ không gặp lỗi. Đó là những gì tệp tiêu đề nói.
David Heffernan

philipvr đã cập nhật bài viết của anh ấy. Anh ấy có (nhiều) vấn đề khác. Anh ấy đang nghĩ đến việc cài đặt lại MSVS.
engf-010,

3

Giải quyết nó bằng cách đặt các tệp bao gồm và định nghĩa sau vào trước:

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

#include <windows.h>

Điều này đã sửa cả bản dựng x86 và x64 của tôi. Tôi cần thêm những dòng này trước đây #include <WinUser.h>.
Jonathan Lidbeck

2

Nếu bạn đang sử dụng Resharper, hãy đảm bảo rằng nó không thêm tiêu đề sai cho bạn, các trường hợp rất phổ biến với ReSharper là:
- #include <consoleapi2.h
-#include <apiquery2.h>

CẬP NHẬT :
Một gợi ý khác là kiểm tra xem bạn có đang bao gồm "một phần Windows.h" hay không, ý tôi là nếu bạn bao gồm winbase.h hoặc minwindef.h, bạn có thể gặp lỗi đó, hãy thêm "the big" để thay thế Windows.h. Ngoài ra còn có một số trường hợp ít rõ ràng hơn mà tôi đã trải qua, đáng chú ý nhất là khi tôi chỉ đưa vào synchapi.h, tài liệu nói rõ rằng đó là tiêu đề được bao gồm cho một số chức năng như AcquireSRWLockShared nhưng nó đã kích hoạt kiến ​​trúc Không có mục tiêu, cách khắc phục là xóa synchapi.h và đưa vào Windows.h "lớn". Windows.h là một công cụ tuyệt vời, nó định nghĩa các macro (nhiều trong số chúng loại bỏ lỗi No target vòm) và bao gồm nhiều tiêu đề khác. Tóm lại , hãy luôn kiểm tra xem bạn có đưa vào một số tiêu đề có thể được thay thế bằng Windows hay không.


1

Một lý do khác gây ra lỗi (trong số nhiều nguyên nhân khác xảy ra khi thay đổi bản dựng đích của dự án Win32 thành X64) là không cài đặt trình biên dịch C ++ 64 bit như đã lưu ý ở đầu trang này .
Ngoài nhận xét của philipvr về các tiêu đề con, (trong trường hợp của tôi), việc bao gồm winnt.h rõ ràng là không cần thiết khi windows.h đang được sử dụng.


Một lượt truy cập khác vào trang này nảy sinh khi một dự án cũ tình cờ có `#include <synchapi.h>` trong tiêu đề CriticalSection.
Laurie Stearn

1

Tôi đã có một vấn đề tương tự. Trong trường hợp của tôi, tôi đã vô tình đưa vào winuser.htrước đó windows.h(thực ra, một tiện ích mở rộng IDE có lỗi đã thêm nó). Xóa winuser.hvấn đề đã giải quyết.


1
Đối với tôi ReSharper đã thêmconsoleapi2.h
SWdV

1

Ngoài các nguyên nhân đã được mô tả, tôi nhận được lỗi này vì tôi bao gồm:

#include <fileapi.h>

Rõ ràng nó không cần thiết (mặc dù có lệnh gọi CreateDirectoryW). Sau khi bình luận ra, trình biên dịch rất vui. Rất lạ.


1

Ở đầu tệp bạn đang biên dịch, trước khi bất kỳ include, hãy thử đặt MỘT trong các dòng này

#define _X86_
#define _AMD64_
#define _ARM_

Chọn cái thích hợp, chỉ một cái, tùy thuộc vào kiến ​​trúc của bạn.


0

Nếu bạn đang xây dựng 32bit thì hãy đảm bảo rằng bạn không có _WIN64 được định nghĩa cho dự án của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.