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
相关产品推荐
相关产品推荐

