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

