我想在我自己的使用 CMake 的项目中使用 uWebSockets。
我有两个问题:
如果我可以让它与 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 集成的讨论。虽然我不确定它是否仍然是最新的或比需要的时间更长。
我想描述我如何通过 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})
我很高兴收到有关该解决方案的一些反馈。
我能够使用 jack 的回答在 Windows 10 上使用 uWebSockets 配置 CMake 项目,并进行一项修改:
在
$ROOT/external/uWebSockets/CMakeLists.txt
文件中,我添加了以下两行:
set(UWS_NO_ZLIB 0)
set(LIBUS_NO_SSL 0)
对于上下文,我使用 MinGW64 作为编译器,并使用 MSYS2 安装
libuv
依赖项。