報錯C1189 #error: "No Target Architecture"


根本原因:

是因為單獨包含了一些windows.h已經包含了的頭文件如"fileapi.h","WinUser.h",但是卻沒有包含windows.h
或者
先包含了如"fileapi.h","WinUser.h",后包含windows.h,順序不對

先說解決方案:

在代碼中 加入include  “windows.h” 即可,或者調整順序,把winows.h放在前面

 

網上的解決方案:

在項目中添加_AMD64_宏(其他三個也可以)也可以解決該問題
具體方法:項目名稱右鍵-->屬性-->C/C++-->預處理器-->添加宏,如下所示:
error C1189: #error :

 

具體過程:

我在調用ShellExecute 函數時提示錯誤 "No Target Architecture",代碼簡化如下:

#include "stdafx.h"
#include "WinUser.h"
#include <ShellAPI.h>
int main()
{
    ShellExecute(0, NULL, L"http://www.baidu.com", NULL, NULL, SW_SHOWNORMAL);
    return 0;
}

定位錯誤位置在winnt.h

#if defined(_AMD64_) || defined(_X86_)
#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
#elif defined(_IA64_) || defined(_ARM_) || defined(_ARM64_)

#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
#elif !defined(RC_INVOKED)
#error "No Target Architecture"
#endif

原因也很簡答,就是沒有定義 (_AMD64_) 、(_X86_)這幾個宏,編譯器檢查到,就拋出異常

 

在調用 ShellExecute時,SW_SHOWNORMAL提示找不到,查了下,SW_SHOWNORMAL這玩意是在"WinUser.h"中定義,於是#include "WinUser.h"

"WinUser.h"里面定義了所有 user32.dll 導出的 API 以及各種宏定義,例如代表消息ID 的 WM_* 宏,與 Windows UI 相關的大部分 API 都是在 winuser.h 中定義的。這個文件是被include在了windows.h中的

所以一般都是直接 #include <windows.h>即可,而上面說到的 (_AMD64_) 、(_X86_)也是在windows.h 中先定義的,所以報錯了

在此例中,winuser和 <ShellAPI.h>都可以刪除,直接包含一個windows.h即可

 

windows.h下的重要的頭文件有哪些:

windows.h是一個最重要的頭文件,它包含了其他Windows頭文件,這些頭文件的某些也包含了其他頭文件。這些頭文件中最重要的和最基本的是:

WINDEF.H 基本數據類型定義
WINNT.H 支持Unicode的類型定義
WINBASE.H Kernel(內核)函數
WINUSER.H 用戶界面函數     //本例中shellexecute就定義在此
WINGDI.H 圖形設備接口函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM