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

arm64架构下集成miniaudio库出现未定义符号错误求助

集成miniaudio库时出现Undefined symbols链接错误

我在程序中集成miniaudio库,运行基础播放示例代码时,终端抛出大量类似以下的链接错误,共18个,均指向miniaudio中的不同函数:

Undefined symbols for architecture arm64:
"_AudioComponentFindNext", referenced from:
ma_context_init__coreaudio(ma_context*, ma_context_config const*, ma_backend_callbacks*) in main.cpp.o

我已确认将miniaudio添加至CMake配置,现有代码如下:

现有代码

main.cpp

#define MINIAUDIO_IMPLEMENTATION

#include "miniaudio.h"


void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)
{
    ma_decoder* pDecoder = (ma_decoder*)pDevice->pUserData;
    if (pDecoder == NULL) {
        return;
    }

    ma_decoder_read_pcm_frames(pDecoder, pOutput, frameCount, NULL);

    (void)pInput;
}


int main(int argc, char** argv)
{
    ma_result result;
    ma_decoder decoder;
    ma_device_config deviceConfig;
    ma_device device;

    if (argc < 2) {
        printf("No input file.\n");
        return -1;
    }

    result = ma_decoder_init_file(argv[1], NULL, &decoder);
    if (result != MA_SUCCESS) {
        return -2;
    }

    deviceConfig = ma_device_config_init(ma_device_type_playback);
    deviceConfig.playback.format   = decoder.outputFormat;
    deviceConfig.playback.channels = decoder.outputChannels;
    deviceConfig.sampleRate        = decoder.outputSampleRate;
    deviceConfig.dataCallback      = data_callback;
    deviceConfig.pUserData         = &decoder;

    if (ma_device_init(NULL, &deviceConfig, &device) != MA_SUCCESS) {
        printf("Failed to open playback device.\n");
        ma_decoder_uninit(&decoder);
        return -3;
    }

    if (ma_device_start(&device) != MA_SUCCESS) {
        printf("Failed to start playback device.\n");
        ma_device_uninit(&device);
        ma_decoder_uninit(&decoder);
        return -4;
    }

    printf("Press Enter to quit...");
    getchar();

    ma_device_uninit(&device);
    ma_decoder_uninit(&decoder);

    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.21)
project(C__NetworkPractice)

set(CMAKE_CXX_STANDARD 14)

add_executable(C__NetworkPractice main.cpp miniaudio.h)


target_link_libraries(C__NetworkPractice PUBLIC)

问题原因及解决办法

这些错误是因为miniaudio在macOS平台依赖CoreAudio等系统框架,但当前CMake配置没有链接这些必要的系统库。

修改CMakeLists.txt,在target_link_libraries中添加macOS所需的系统框架:

cmake_minimum_required(VERSION 3.21)
project(C__NetworkPractice)

set(CMAKE_CXX_STANDARD 14)

add_executable(C__NetworkPractice main.cpp miniaudio.h)

# 根据平台链接对应依赖库
if(APPLE)
    target_link_libraries(C__NetworkPractice PUBLIC
        "-framework CoreAudio"
        "-framework AudioToolbox"
        "-framework AudioUnit"
        "-framework CoreFoundation"
    )
endif()

另外,miniaudio的单头文件特性要求MINIAUDIO_IMPLEMENTATION宏必须只在一个源文件中定义,你的main.cpp中已经正确设置,这部分无需调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:45:21