将 uWebSockets 集成到 CMake 项目中

问题描述 投票:0回答:2

我想在我自己的使用 CMake 的项目中使用 uWebSockets

我有两个问题:

  1. uWebSocket 使用 Make 以及我认为它自己的构建系统/文件 build.c
  2. 它本身依赖于其他库,其中一些使用 CMake,另一些使用 Make。

如果我可以让它与 CMake 一起工作,即使没有反映项目的所有可能性,例如构建示例或链接可选依赖项,例如 uSockets 的 boost asio(其依赖项之一)。

是否可以通过 CMake 的 FetchContent 获取库?请注意,uWebSockets 将其依赖项 uSocket 设置为 git 子模块。

在 CMake 中重写整个 Makefile 而只是从 CMake 中调用 make 是否有意义?

关于 Conan:它抛出一个错误,我也不确定如何修复(在 Linux 上找不到 MSBuild python 包?):

ERROR: Package 'usockets/0.8.5' not resolved: usockets/0.8.5: Cannot load recipe.
Error loading conanfile at '/home/<USER>/.conan2/p/usock995f8272b80d4/e/conanfile.py': Unable to load conanfile in /home/<USER>/.conan2/p/usock995f8272b80d4/e/conanfile.py
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/<USER>/.conan2/p/usock995f8272b80d4/e/conanfile.py", line 7, in <module>
    from conans import MSBuild, AutoToolsBuildEnvironment
ImportError: cannot import name 'MSBuild' from 'conans' (/usr/lib/python3.10/site-packages/conans/__init__.py)

PS:uWebSocket 项目没有入门指南,并且维护者不向 Make 以外的任何其他构建系统开放。

PSS:我发现这个关于 CMake 集成的讨论。虽然我不确定它是否仍然是最新的或比需要的时间更长。

c++ cmake makefile conan uwebsockets
2个回答
6
投票

我想描述我如何通过 CMake 管理最小构建。

项目文件夹结构:

$ROOT/
  CMakeLists.txt
  external/
    CMakeLists.txt
    uSockets/
      CMakeLists.txt
    uWebSockets/
      CMakeLists.txt
  main.cpp

单独的

CMakeLists.txt

# $ROOT/CMakeLists.txt
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
project(MyProj LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 23)
add_subdirectory(external)
add_executable(Main main.cpp)
target_link_libraries(Main uWebSockets)
# $ROOT/external/CMakeLists.txt
add_subdirectory(uSockets)
add_subdirectory(uWebSockets)
# $ROOT/external/uSockets/CMakeLists.txt
cmake_minimum_required(VERSION 3.24)
set(CMAKE_C_STANDARD 11)
include(FetchContent)
FetchContent_Declare(
  uSockets_content
  GIT_REPOSITORY https://github.com/uNetworking/uSockets
  GIT_TAG v0.8.5
  GIT_SHALLOW ON
  GIT_SUBMODULES ""
)
FetchContent_MakeAvailable(uSockets_content)
file(GLOB_RECURSE SOURCES ${usockets_content_SOURCE_DIR}/src/*.c)
add_library(uSockets ${SOURCES})
target_include_directories(uSockets PUBLIC ${usockets_content_SOURCE_DIR}/src)
target_compile_definitions(uSockets PRIVATE LIBUS_NO_SSL)
# $ROOT/external/uWebSockets/CMakeLists.txt
cmake_minimum_required(VERSION 3.24)
include(FetchContent)
FetchContent_Declare(
  uWebSockets_content
  GIT_REPOSITORY https://github.com/uNetworking/uWebSockets
  GIT_TAG v20.37.0
  GIT_SHALLOW ON
  GIT_SUBMODULES ""
)
FetchContent_MakeAvailable(uWebSockets_content)
find_package(ZLIB REQUIRED)
add_library(uWebSockets INTERFACE)
target_include_directories(uWebSockets INTERFACE ${uwebsockets_content_SOURCE_DIR}/src/)
target_link_libraries(uWebSockets INTERFACE uSockets ${ZLIB_LIBRARIES})

我很高兴收到有关该解决方案的一些反馈。


0
投票

我能够使用 jack 的回答在 Windows 10 上使用 uWebSockets 配置 CMake 项目,并进行一项修改:

$ROOT/external/uWebSockets/CMakeLists.txt
文件中,我添加了以下两行:

set(UWS_NO_ZLIB 0)
set(LIBUS_NO_SSL 0)

对于上下文,我使用 MinGW64 作为编译器,并使用 MSYS2 安装

libuv
依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.