CMake项目如何链接互相依赖的库,解决SDL2_mixer未定义引用错误
问题根因
你遇到的undefined reference to 'ov_clear'错误核心原因有两点:
ov_clear属于libvorbisfile组件,你当前只编译了libvorbis核心库,没有将vorbisfile的源码加入编译目标- 配置中缺少vorbisfile依赖声明,导致链接时找不到对应符号
疑问解答
1. 是否需要在SDL_mixer项目内部通过add_subdirectory()引入ogg和vorbis?
不需要。你在根CMakeLists中已经提前执行add_subdirectory引入了ogg和vorbis,CMake的库目标是全局可见的,只要子目录(SDL_mixer)能正确识别对应的库目标即可,不需要重复引入。父目录通过set定义的普通变量可以被子目录继承,你的配置的变量作用域没有问题。
2. 这种场景下是否无法对这些库进行静态链接?
完全可以静态链接,不存在场景限制,你只需要补全依赖、调整配置即可完成链接。
修复步骤
- 补全vorbis编译目标,加入vorbisfile源码
你当前的vorbis CMakeLists只编译了核心库,需要添加vorbisfile的源码,示例修改如下:
# 在libvorbis的CMakeLists.txt中补充vorbisfile相关文件 set(VORBIS_FILE_HEADERS include/vorbis/vorbisfile.h ) set(VORBIS_FILE_SOURCES lib/vorbisfile.c ) # 把vorbisfile源码加入到vorbis库的编译列表中 add_library(vorbis ${VORBIS_HEADERS} ${VORBIS_SOURCES} ${VORBIS_FILE_HEADERS} ${VORBIS_FILE_SOURCES})
如果你不想把vorbisfile合并到vorbis库,也可以单独编译为vorbisfile库,然后在SDL_mixer的target_link_libraries中添加该库即可。
确认静态库链接顺序
静态库链接要求依赖方在前、被依赖方在后,正确的链接顺序应为:SDL_mixer → vorbisfile → vorbis → ogg。你已经在SDL_mixer的target_link_libraries中声明了对vorbis和ogg的依赖,现代CMake会自动处理链接顺序,补全vorbisfile依赖后即可正常识别。检查编译宏配置
你当前SDL_mixer只定义了MUSIC_OGG,确认没有遗漏其他OGG支持相关的编译开关,部分版本的SDL_mixer还需要定义OGG相关路径宏,你当前编译没有报头文件错误,大概率不需要额外修改。
内容的提问来源于stack exchange,提问作者vinnylinux
相关产品推荐
相关产品推荐

