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

MinGW64环境下GCC编译PulseAudio程序出现“undefined reference to pa_simple_new”错误的排查与求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 15:54:31