MinGW64环境下GCC编译PulseAudio程序出现“undefined reference to pa_simple_new”错误的排查与求助
大家好,我最近在MinGW64环境下用GCC编译一个调用PulseAudio库的简单录音程序时,碰到了一个棘手的链接错误,折腾了好一阵才找到根源,想把整个过程分享出来,也希望能帮到遇到同样问题的朋友。
我的测试代码
这是我写的test.c文件,功能是初始化PulseAudio的录音流:
#include <stdio.h> #include <pulse/simple.h> #define SAMPLE_RATE 44100 #define BUFFER_SIZE 1024 int main(int argc, char *argv[]) { pa_sample_spec sample_spec = { .format = PA_SAMPLE_S16LE, .rate = SAMPLE_RATE, .channels = 1 }; pa_simple *pulse_input = pa_simple_new( NULL, // 使用默认服务器 "My App", // 应用名称 PA_STREAM_RECORD, // 录音模式 NULL, // 使用默认设备 "Audio Input", // 流描述 &sample_spec, // 采样格式与速率 NULL, // 使用默认通道映射 NULL, // 使用默认缓冲属性 NULL // 忽略错误码 ); }
遇到的编译错误
我尝试用gcc -o test.exe test.c -lpulse编译时,总是弹出如下链接错误:
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\msys64\tmp\ccyzDfRA.o:test.c:(.text+0x72): undefined reference to `pa_simple_new' collect2.exe: error: ld returned 1 exit status
这让我很困惑——IntelliSense能正常识别头文件,运行gcc -H test.c也能看到C:/msys64/mingw64/include/pulse/simple.h被正确加载,怎么GCC就找不到函数定义呢?
我做过的排查步骤
为了解决这个问题,我尝试了各种方法:
- 按照微软的MSYS2配置指南搭建环境,明确使用Mingw-w64而非UCRT版本
- 将
C:\msys64\mingw64\bin添加到系统PATH中 - 通过pacman安装了与我的GCC版本匹配的pulseaudio包
- 验证了头文件确实存在于
C:\msys64\mingw64\include\pulse目录下 - 尝试过网上建议的调整PATH、添加
-I(指定头文件路径)和-L(指定库路径)参数,均无效
最终解决方法
后来在HolyBlackCat的帮助下我才发现,问题出在链接的库不完整!
我之前一直用pkg-config --libs --cflags libpulse来获取编译参数,但实际上pa_simple_new属于libpulse-simple库,而非基础的libpulse。正确的做法是使用pkg-config --libs --cflags libpulse-simple来获取完整的编译链接参数,或者直接在编译命令里加上-lpulse-simple,比如:
gcc -o test.exe test.c $(pkg-config --libs --cflags libpulse-simple)
我觉得这个问题不应该被简单标记为重复——我之前查过的类似问题的解决方案都和这个不一样,而且这个解决方法其实更简单,只是我没意识到使用PulseAudio的simple接口需要链接多个库。网上大部分资源都只在说PATH配置或者-I/-L参数的问题,完全没提到这个关键点。
备注:内容来源于stack exchange,提问作者Frank

