使用CMake构建Android版libshout时Vorbis依赖目标找不到的问题
CMake构建libshout for Android时Vorbis目标查找失败问题
场景与顶层CMake配置
尝试为Android平台构建libshout库,顶层CMakeLists.txt配置如下:
FetchContent_Declare( ogg GIT_REPOSITORY https://github.com/xiph/ogg.git GIT_TAG v1.3.5 FIND_PACKAGE_ARGS ) FetchContent_Declare( vorbis GIT_REPOSITORY https://github.com/xiph/vorbis.git GIT_TAG v1.3.7 FIND_PACKAGE_ARGS ) FetchContent_MakeAvailable(ogg) FetchContent_MakeAvailable(vorbis) add_subdirectory(third_party/shout)
初始错误信息
构建时触发如下错误:
CMake Error at third_party/shout/CMakeLists.txt:41 (target_link_libraries): Target "shout" links to: Vorbis::vorbis
对应libshout的CMakeLists.txt代码段:
find_package(Vorbis REQUIRED) target_link_libraries(shout PRIVATE Vorbis::vorbis Vorbis::vorbisenc Vorbis::vorbisfile)
find_package执行无报错,但无法找到Vorbis::vorbis等目标。
修改后的新错误
将FetchContent_Declare的第一个参数改为vrbs(同步修改FetchContent_MakeAvailable)后,出现新错误:
CMake Error at /snap/cmake/1399/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find Vorbis (missing: VORBIS_INCLUDE_DIRS VORBIS_LIBRARIES) Call Stack (most recent call first): /snap/cmake/1399/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE) third_party/shout/cmake/FindVorbis.cmake:19 (find_package_handle_standard_args) third_party/shout/CMakeLists.txt:40 (find_package)
解决方法
- 恢复FetchContent的包名称:把修改后的
vrbs改回vorbis,FetchContent的包名必须和find_package查找的包名完全一致,否则CMake无法关联下载的包与查找请求。 - 强制使用CONFIG模式查找Vorbis:在libshout的CMakeLists.txt中修改
find_package调用,强制CMake使用配置文件查找(FetchContent下载的包会生成标准配置文件):find_package(Vorbis REQUIRED CONFIG) - 手动控制FetchContent的构建流程:若
FetchContent_MakeAvailable未正确导出目标,可手动替换为以下代码,确保Vorbis的目标被正确添加并导出:FetchContent_GetProperties(vorbis) if(NOT vorbis_POPULATED) FetchContent_Populate(vorbis) add_subdirectory(${vorbis_SOURCE_DIR} ${vorbis_BINARY_DIR}) endif() - 确保Ogg依赖被正确关联:Vorbis依赖Ogg,当前顶层配置中先构建Ogg再构建Vorbis的顺序是正确的,无需调整,但可确认Ogg是否导出了
Ogg::ogg目标。
内容的提问来源于stack exchange,提问作者s0nicYouth
相关产品推荐
相关产品推荐

