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

使用libwebsockets+mbedtls构建项目遇CMake导出集错误求助

问题描述

使用FetchContent拉取libwebsockets和mbedtls构建项目,配置阶段触发以下CMake错误:

CMake Error in build/_deps/libwebsockets-src/CMakeLists.txt:
  export called with target "websockets" which requires target "mbedtls" that
  is not in any export set.


CMake Error in build/_deps/libwebsockets-src/CMakeLists.txt:
  export called with target "websockets" which requires target "mbedcrypto" that
  is not in any export set.


CMake Error in build/_deps/libwebsockets-src/CMakeLists.txt:
  export called with target "websockets" which requires target "mbedx509" that
  is not in any export set.

确认mbedtls已将相关目标导出到MbedTLSTargets集合:

set(target_libraries ${mbedcrypto_target} ${mbedx509_target} ${mbedtls_target})
# ...
foreach(target IN LISTS target_libraries)
    # ...
    install(
        TARGETS ${target}
        EXPORT MbedTLSTargets
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
endforeach(target)

疑问:为何导出信息未传递给libwebsockets?是否需要在主项目重新声明目标导出规则?

解决方案

不需要在主项目重新声明导出规则,问题根源是依赖拉取顺序和导出集的可见性问题,可通过以下几种方式解决:

  • 调整FetchContent的拉取顺序
    确保先完成mbedtls的拉取和配置,再处理libwebsockets。CMake中FetchContent的处理顺序会影响目标的可见性,修改主项目的CMake代码:

    # 先拉取并配置mbedtls
    FetchContent_Declare(
        mbedtls
        GIT_REPOSITORY https://github.com/ARMmbed/mbedtls.git
        GIT_TAG v2.28.0 # 替换为你需要的版本
    )
    FetchContent_MakeAvailable(mbedtls)
    
    # 再拉取并配置libwebsockets
    FetchContent_Declare(
        libwebsockets
        GIT_REPOSITORY https://github.com/warmcat/libwebsockets.git
        GIT_TAG v4.3.2 # 替换为你需要的版本
    )
    FetchContent_MakeAvailable(libwebsockets)
    

    使用FetchContent_MakeAvailable会自动处理GetProperties和add_subdirectory,确保mbedtls的目标在libwebsockets配置前已完全初始化。

  • 显式导入mbedtls的导出集
    如果调整顺序后仍有问题,在主项目中,在添加libwebsockets子目录前,显式导入mbedtls的导出文件:

    # 导入mbedtls的导出目标
    include(${mbedtls_BINARY_DIR}/MbedTLSTargets.cmake)
    # 再添加libwebsockets子目录
    add_subdirectory(${libwebsockets_SOURCE_DIR})
    

    这会确保mbedtls的目标被CMake识别并纳入全局导出上下文。

  • 禁用libwebsockets的自动导出
    如果不需要导出libwebsockets的目标到外部项目,可在配置libwebsockets前设置LIBWEBSOCKETS_NO_EXPORT变量,避免触发export命令:

    set(LIBWEBSOCKETS_NO_EXPORT ON CACHE BOOL "" FORCE)
    FetchContent_MakeAvailable(libwebsockets)
    
原理说明

CMake的export命令要求目标的所有依赖项都必须属于某个导出集。当libwebsockets执行export时,mbedtls的目标虽已被安装到MbedTLSTargets,但如果这些目标未在当前CMake上下文的导出集中可见,就会触发错误。调整拉取顺序或显式导入导出集,能让CMake识别到mbedtls目标的导出属性,从而解决依赖检查失败的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:40:25