You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在OpenSUSE Leap 15.4编译Drake源码时遇std::string_view转换错误

解决OpenSUSE Leap 15.4下源码编译Drake时spdlog与fmt的兼容问题

问题背景

  • 运行环境:OpenSUSE Leap 15.4,GCC 10.5.0,采用C++14标准编译
  • 编译进度:Drake源码编译至约9500/10500,为spdlog与fmt前期编译错误的后续问题
  • 尝试的两组依赖版本组合:
    1. fmt 8.1.1 + spdlog 1.10.0
    2. fmt 10.0.0 + spdlog 1.12.0
  • 共性问题:两组组合初始均触发链接错误,添加-DCMAKE_POSITION_INDEPENDENT_CODE=TRUE重新编译fmt和spdlog后解决
  • 组合1后续错误:编译时抛出std::string_view无法转换为const key_type&的类型不匹配错误
  • 组合2后续问题:编译过程中出现参数未使用的警告

针对性解决方案

组合1(fmt 8.1.1 + spdlog 1.10.0)的类型转换错误修复

该错误源于spdlog 1.10.0与fmt 8.x在string_view适配上的版本冲突,GCC 10.5.0的C++14环境下string_view的实现与spdlog预期的容器键类型不兼容。解决步骤:

  1. 编译spdlog时添加CMake参数-DSPDLOG_FMT_EXTERNAL=ON,强制spdlog使用外部编译的fmt库,避免内置fmt拷贝引发的版本不一致
  2. 编译Drake时显式指定fmt和spdlog的CMake配置路径,例如:
    cmake .. -DFMT_DIR=/path/to/fmt/install/lib/cmake/fmt -DSPDLOG_DIR=/path/to/spdlog/install/lib/cmake/spdlog
    

组合2(fmt 10.0.0 + spdlog 1.12.0)的未使用参数警告处理

这类警告是fmt 10.x的API变更导致spdlog 1.12.0中部分参数不再被调用,属于兼容层面的非致命问题,可按以下方式处理:

  1. 临时抑制警告:在编译Drake时添加编译选项-Wno-unused-parameter,或在CMake配置中针对相关目标设置:
    target_compile_options(<your_drake_target> PRIVATE -Wno-unused-parameter)
    
  2. 彻底解决:将spdlog升级至1.13.0及以上版本,官方已在该版本中完成与fmt 10.x的兼容适配,可消除此类警告

通用编译注意事项

  • 严格遵循spdlog官方的版本兼容矩阵选择fmt版本,避免跨版本兼容问题
  • 编译所有依赖库时统一启用-DCMAKE_POSITION_INDEPENDENT_CODE=TRUE,从根源避免链接错误
  • Docker环境下,建议在Dockerfile中固化依赖版本、编译参数,确保环境一致性

内容的提问来源于stack exchange,提问作者Daniel He

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:05:17