在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前期编译错误的后续问题
- 尝试的两组依赖版本组合:
- fmt 8.1.1 + spdlog 1.10.0
- 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预期的容器键类型不兼容。解决步骤:
- 编译spdlog时添加CMake参数
-DSPDLOG_FMT_EXTERNAL=ON,强制spdlog使用外部编译的fmt库,避免内置fmt拷贝引发的版本不一致 - 编译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中部分参数不再被调用,属于兼容层面的非致命问题,可按以下方式处理:
- 临时抑制警告:在编译Drake时添加编译选项
-Wno-unused-parameter,或在CMake配置中针对相关目标设置:target_compile_options(<your_drake_target> PRIVATE -Wno-unused-parameter) - 彻底解决:将spdlog升级至1.13.0及以上版本,官方已在该版本中完成与fmt 10.x的兼容适配,可消除此类警告
通用编译注意事项
- 严格遵循spdlog官方的版本兼容矩阵选择fmt版本,避免跨版本兼容问题
- 编译所有依赖库时统一启用
-DCMAKE_POSITION_INDEPENDENT_CODE=TRUE,从根源避免链接错误 - Docker环境下,建议在Dockerfile中固化依赖版本、编译参数,确保环境一致性
内容的提问来源于stack exchange,提问作者Daniel He
相关产品推荐
相关产品推荐

