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

在CMake项目中使用Drake时遇到spdlog编译兼容问题

解决Drake库与spdlog的编译冲突问题

错误原因分析

从编译日志来看,核心问题是fmt库版本不兼容:

  • 新版spdlog依赖的fmt(如v9+)引入了format_string、basic_runtime等新类型,但当前编译环境中实际调用的是旧版fmt(错误信息显示为fmt::v5),导致符号无法识别。
  • Drake库自身捆绑了特定版本的fmt,而你手动安装的spdlog依赖另一版本的fmt,两者路径冲突,编译器优先加载了旧版fmt头文件。

解决方案

1. 让spdlog复用Drake自带的fmt

Drake会统一管理依赖版本,可通过编译配置让spdlog使用Drake内置的fmt:
如果使用CMake,在项目的CMakeLists.txt中调整依赖顺序与参数:

# 先加载Drake,确保其fmt优先被识别
find_package(Drake REQUIRED)
# 强制spdlog使用内置fmt(或复用外部已加载的Drake fmt)
set(SPDLOG_FMT_EXTERNAL OFF)
find_package(spdlog REQUIRED)

# 链接目标时同时关联Drake与spdlog
target_link_libraries(your_target PRIVATE drake::drake spdlog::spdlog)

2. 统一fmt与spdlog版本

若需使用自定义安装的spdlog,需确保其依赖的fmt版本与Drake匹配:

  1. 查阅Drake官方文档,确认其依赖的fmt版本(如Drake v1.20+通常依赖fmt v9.x)
  2. 安装对应版本的fmt,再编译spdlog并指定该fmt:
# 安装匹配版本的fmt(以v9.1.0为例)
git clone https://github.com/fmtlib/fmt.git
cd fmt && git checkout 9.1.0
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/your/custom/path ..
make install

# 编译spdlog并绑定上述fmt
git clone https://github.com/gabime/spdlog.git
cd spdlog && mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/your/custom/path -DSPDLOG_FMT_EXTERNAL=ON -DFMT_DIR=/your/custom/path/lib/cmake/fmt ..
make install

之后在项目编译时,指定优先搜索该自定义路径下的依赖,避免与系统或Drake内置版本冲突。

3. 清理冲突的依赖路径

检查编译命令的-I参数,确认是否同时包含多个版本的fmt头文件路径(如系统/usr/include与自定义路径),调整头文件搜索顺序,优先加载匹配版本的fmt。

4. 直接使用Drake内置日志功能

Drake已封装spdlog,无需单独安装即可使用:

#include "drake/common/text_logging.h"

// 使用Drake日志宏
DRAKE_LOG_INFO("日志内容示例");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:22:22