Windows串口之解决包含setupapi.h还提示找不到符号报错

2025-12-03 09:54:56

关于

本文演示环境: win10 1909 + VS2017

1. 错误信息

明明已经添加了头文件setupapi.h 和 库 setupapi.lib, 却还是提示报错,报错信息:

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\setupapi.h(65): error C2143: 语法错误: 缺少“;”(在“*”的前面)

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\setupapi.h(65): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\spapidef.h(28): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\spapidef.h(28): error C2146: 语法错误: 缺少“;”(在标识符“SP_LOG_TOKEN”的前面)

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\prsht.h(104): error C2065: “CALLBACK”: 未声明的标识符

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\prsht.h(104): error C2065: “LPFNPSPCALLBACKA”: 未声明的标识符

.....

2. 错误示范

#include // Includes the SetupAPI.

只写上面的这行代码,就会提示错误,尽管包含了头文件。 加上头文件 windows.h就不会出现这些错误了(注意, windows.h放在setupapi.h的前面,否则,还是会出现上面的错误):

#include // Includes basic windows functionality.

#include // Includes the SetupAPI.

But, 却出现下面的提示:

>C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\winnt.h(154): fatal error C1189: #error: "No Target Architecture"

双击错误提示,可以看到下面的源码:

...

//

// Note: RC_INVOKED is checked in PROBE_ALIGNMENT to maintain compatibility with previous

// versions of the SDK which did not block inclusion in an .RC file.

//

#if defined(_AMD64_) || defined(_X86_)

#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )

#elif defined(_IA64_) || defined(_ARM_) || defined(_ARM64_)

//

// TODO: WOWXX - Unblock ARM. Make all alignment checks DWORD for now.

//

#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )

#elif !defined(RC_INVOKED)

#error "No Target Architecture"

#endif

...

这里出现了错误中的 No Target Architecture。

可以看到,这里的宏定义走到了下面的#elif !defined(RC_INVOKED) ,换而言之,应该满足上面#if defined(_AMD64_) || defined(_X86_) 或者 #elif defined(_IA64_) || defined(_ARM_) || defined(_ARM64_) 就可以不出错

3. 解决

3.1 注意引入头文件的顺序,windows.h要在前面。

#include

#include

3.2 添加库引用

#pragma comment (lib, "setupapi.lib")

或者在VS中配置

3.3 VS项目属性-> 配置 -> C/C++ -> 预处理器 -> 预处理器定义, 增加 满足上面条件的宏,比如: _X86_

    太阳系藏着 “金属巨球”?磁场比地球强 10 倍,表面全是铁镍矿
    [综合]功夫世界杯总决赛77公斤级:科恩VS劳尔森

    Copyright © 2022 北智游戏学院 - 活动攻略与新手教学 All Rights Reserved.