在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匹配:
- 查阅Drake官方文档,确认其依赖的fmt版本(如Drake v1.20+通常依赖fmt v9.x)
- 安装对应版本的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
相关产品推荐
相关产品推荐

