如何将uWebSockets集成到CMake项目中?
CMake集成uWebSockets的问题解决方案
一、能否用CMake FetchContent获取库?
可以,FetchContent支持拉取带Git子模块的仓库,只需在配置时指定子模块名称:
include(FetchContent) FetchContent_Declare( uWebSockets GIT_REPOSITORY https://github.com/uNetworking/uWebSockets.git GIT_TAG v20.44.0 # 替换为你需要的版本 GIT_SUBMODULES "uSockets" ) FetchContent_MakeAvailable(uWebSockets)
拉取完成后,需要额外处理构建逻辑,因为uWebSockets本身依赖Make构建。
二、直接调用make vs 重写CMake配置:选哪个?
优先选在CMake中直接调用make,原因如下:
- 维护成本低:无需手动适配uWebSockets和uSockets的所有构建规则,避免和上游代码更新冲突
- 贴合官方支持:官方仅维护Make构建,直接调用能保证构建逻辑与官方一致
- 实现简单:通过
ExternalProject_Add或add_custom_target触发make构建,无需深入改写构建规则
示例实现(基于ExternalProject):
include(ExternalProject) # 调用make构建uWebSockets,可关闭不需要的功能 ExternalProject_Add( uWebSockets_build SOURCE_DIR ${uWebSockets_SOURCE_DIR} CONFIGURE_COMMAND "" BUILD_COMMAND make -C ${uWebSockets_SOURCE_DIR} NO_EXAMPLES=1 NO_BOOST=1 INSTALL_COMMAND "" BUILD_IN_SOURCE ON ) # 导入构建好的uWebSockets库 add_library(uWebSockets STATIC IMPORTED) set_target_properties(uWebSockets PROPERTIES IMPORTED_LOCATION ${uWebSockets_SOURCE_DIR}/libuWS.a INTERFACE_INCLUDE_DIRECTORIES ${uWebSockets_SOURCE_DIR}/src ) add_dependencies(uWebSockets uWebSockets_build) # 导入依赖的uSockets库 add_library(uSockets STATIC IMPORTED) set_target_properties(uSockets PROPERTIES IMPORTED_LOCATION ${uWebSockets_SOURCE_DIR}/uSockets/libusockets.a INTERFACE_INCLUDE_DIRECTORIES ${uWebSockets_SOURCE_DIR}/uSockets/src ) add_dependencies(uSockets uWebSockets_build) # 链接到你的项目目标 target_link_libraries(你的项目目标 PRIVATE uWebSockets uSockets)
三、Conan报错的解决办法
你遇到的ImportError: cannot import name 'MSBuild' from 'conans'问题原因:
- 该usockets包的配方基于Conan 1.x编写,与Conan 2.x的API不兼容
- Linux环境下完全不需要MSBuild,配方错误引入了Windows平台的构建工具
解决途径:
- 优先放弃Conan安装,改用前面的FetchContent+make方案,更适配官方构建逻辑
- 若坚持用Conan,可切换到Conan 1.x环境,或寻找适配Conan 2.x的uWebSockets/usockets包
四、关于CMake集成讨论帖的建议
无需纠结方案是否“最优”,只要能满足你的核心需求(在CMake项目中正常链接使用uWebSockets)即可。优先选择基于官方支持的构建方式衍生的集成方案,能减少后续维护的麻烦。
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

