macOS编译userver项目时遭遇fmt::join未定义的编译错误
macOS编译userver项目时遭遇fmt::join未定义的编译错误
看起来你在macOS上搭建userver项目时碰到了编译卡壳的问题,我帮你梳理下可能的原因和解决思路:
先确认你的问题场景
你当前的环境和操作步骤:
- 系统:macOS
- 依赖版本:Boost 1.85.0,clang 13.0.0
- 操作流程:
- 克隆了service_template模板项目,并将userver作为第三方依赖放入对应目录
- 通过brew安装了userver文档中列出的macOS依赖
- 执行
make build-release时触发编译错误,错误信息如下:
49_USERVER/01_tutorial/service_template/third_party/userver/universal/src/yaml_config/impl/validate_static_config.cpp:59:44: error: no member named 'join' in namespace 'fmt'
enum_value.Asstd::string(), fmt::join(ordered_enum_values, ", ")));
~...
可能的原因和解决办法
这个错误本质是编译器找不到fmt::join符号,大概率是fmt库版本不兼容或者编译时引用的fmt库不符合userver的要求,你可以尝试以下方案:
- 检查brew安装的fmt版本
先执行命令查看当前系统的fmt版本:
userver对fmt库有特定版本要求,如果你安装的版本过高(比如fmt 10+),可能会出现API兼容性问题。可以尝试安装指定版本的fmt,比如:brew list --versions fmtbrew unlink fmt brew install fmt@9 brew link fmt@9 --force - 强制使用userver内置的fmt依赖
userver本身可能自带了兼容版本的fmt库,你可以在编译时指定cmake参数优先使用内置依赖,修改make命令对应的编译配置,或者直接在build目录下手动执行cmake:cd build-release cmake .. -DCMAKE_PREFIX_PATH=./third_party/userver/third_party/fmt make - 升级clang编译器版本
clang 13.0.0相对老旧,对C++20特性的支持可能不够完善,而fmt的新版本可能依赖这些特性。你可以通过brew升级llvm来获取新版本clang:
之后再重新执行编译命令。brew install llvm echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.zshrc source ~/.zshrc - 确认userver子模块完整
有时候克隆userver时可能没拉取全子模块,导致内置的fmt库缺失,执行以下命令补全子模块:cd service_template/third_party/userver git submodule update --init --recursive cd ../.. make clean make build-release
备注:内容来源于stack exchange,提问作者mascai
相关产品推荐
相关产品推荐

