You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MinGW64下C语言能否使用WASAPI?__uuidof编译报错如何解决?

WASAPI编译问题解答

WASAPI是否只支持C++?

不是,WASAPI基于COM标准,同时兼容C和C++。COM是二进制接口规范,只要遵循COM的调用规则,用C语言也能正常调用WASAPI的所有功能,只是C++可以借助编译器特性简化代码编写。

编译错误原因及解决办法

你碰到的__uuidof未声明错误,核心是MinGW环境的语言/编译器配置问题:

  • __uuidof是微软VC的C扩展语法,MinGW的C编译器(gcc)默认不支持这个关键字;就算用MinGW的C编译器(g),也得手动开启对微软扩展的支持才能识别它。

具体解决方式:

1. 切换到C++编译并启用微软扩展

如果你的代码是C写的,编译时改用g,加上-fms-extensions选项开启微软扩展支持:

g++ 你的代码文件.cpp -o 输出程序名 -fms-extensions -lole32

这样__uuidof就能被正确解析。

2. 直接用硬编码的CLSID/IID值替代__uuidof

要是你需要用C语言编译,或者不想依赖编译器扩展,可以直接用WASAPI接口对应的CLSID和IID常量值:

// 替换原来的__uuidof代码
const CLSID CLSID_MMDeviceEnumerator = {0xbcde0395, 0xe52f, 0x467c, {0x8e, 0x3d, 0xc4, 0x57, 0x92, 0x91, 0x69, 0x2e}};
const IID IID_IMMDeviceEnumerator = {0xa95664d2, 0x9614, 0x4f35, {0xa7, 0x46, 0xde, 0x8d, 0xb6, 0x36, 0x17, 0xe6}};
const IID IID_IAudioClient = {0x1cb9ad4c, 0xdbfa, 0x4c32, {0xb1, 0x78, 0xc2, 0xf5, 0x68, 0xa7, 0x03, 0xb2}};
const IID IID_IAudioRenderClient = {0xf294acfc, 0x3146, 0x4483, {0xa7, 0xbf, 0xad, 0xdc, 0xa7, 0xc2, 0x60, 0xe2}};

这些值可以从Windows SDK的头文件(比如mmdeviceapi.h、audioclient.h)里查到,或者用uuidgen工具获取。

3. 使用MinGW自带的UUIDOF宏替代

MinGW提供了替代__uuidof的宏UUIDOF,需要先定义__USE_MINGW_UUIDOF再包含相关头文件:

#define __USE_MINGW_UUIDOF
#include <uuid/uuid.h>
#include <mmdeviceapi.h>
#include <audioclient.h>

const CLSID CLSID_MMDeviceEnumerator = UUIDOF(MMDeviceEnumerator);
const IID IID_IMMDeviceEnumerator = UUIDOF(IMMDeviceEnumerator);
// 其他IID同理定义

编译时同样要链接ole32库:gcc 你的代码文件.c -o 输出程序名 -lole32


内容的提问来源于stack exchange,提问作者Manatee Pink

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:56:13