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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:15:13