MacOS编译Userver框架报错:boost::uuids::uuid无法转换为utils::span
MacOS编译Userver框架时的Boost版本兼容错误
问题背景
在MacOS上依照Userver官方教程部署框架,执行以下操作:
git clone --depth 1 https://github.com/userver-framework/service_template.git && \ git clone --depth 1 https://github.com/userver-framework/userver.git service_template/third_party/userver && \ cd service_template brew install $(cat third_party/userver/scripts/docs/en/deps/macos.md | tr '\n' ' ') make build-release && \ make service-start-release
当前环境:
- Boost版本:1.86.0
- clang版本:13.0.0
编译错误信息
编译过程中出现如下错误:
25%] Building CXX object third_party/userver/universal/CMakeFiles/userver-universal.dir/src/utils/impl/byte_utils.cpp.o /Users/mascai/root_folder/dev/projects/49_USERVER/01_tutorial/service_template/third_party/userver/universal/src/utils/boost_uuid7.cpp:49:27: error: no matching conversion for functional-style cast from 'boost::uuids::uuid::data_type' to 'utils::span<std::uint8_t>' (aka 'span<unsigned char>') GenerateRandomBlock(utils::span<std::uint8_t>(uuid.data).subspan(8)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
问题原因
Boost 1.86.0对boost::uuids::uuid::data的返回类型做了变更——此前版本返回uint8_t*指针,而1.86.0返回std::array<uint8_t, 16>,Userver现有代码的span构造逻辑无法适配这个类型变化。
解决方案
方案1:降级Boost到兼容版本
卸载当前Boost并安装1.85.0版本:
brew uninstall boost brew install boost@1.85 brew link boost@1.85 --force
完成后重新执行编译命令即可。
方案2:修改Userver源码适配新版本Boost
编辑third_party/userver/universal/src/utils/boost_uuid7.cpp文件,将第49行代码修改为:
GenerateRandomBlock(utils::span<std::uint8_t>(uuid.data.data(), uuid.data.size()).subspan(8));
修改后重新执行make build-release编译。
内容的提问来源于stack exchange,提问作者mascai
相关产品推荐
相关产品推荐

