使用Conan时spdlog与fmt版本冲突问题咨询
Conan版本冲突问题:spdlog/1.11.0与fmt/9.1.0依赖冲突
问题描述
我正在学习Conan,尝试把部分CMake文件从CPM、CMake内置的FetchContent_Declare切换到Conan使用。指定的包版本是fmt:9.1.0、spdlog:1.11.0,用CPM或FetchContent_Declare都能正常拉取构建运行,但用Conan时出现版本冲突错误:
ERROR: Version conflict: spdlog/1.11.0->fmt/10.0.0, ->fmt/9.1.0.
我的conanfile.py代码如下:
from conan import ConanFile from conan.tools.cmake import CMakeToolchain class CompressorReceipe(ConanFile): settings = "os", "compiler", "build_type", "arch" generators = "CMakeDeps" def requirements(self): self.requires("nlohmann_json/3.11.2") self.requires("spdlog/1.11.0") self.requires("fmt/9.1.0") self.requires("catch2/2.13.9") self.requires("cxxopts/3.1.1") def generate(self): tc = CMakeToolchain(self) tc.user_presets_path = False tc.generate()
我查了Conan中心的spdlog依赖信息,显示它依赖fmt/9.1.0而非错误里的10.0.0。测试升级fmt到10.0.0后能编译,但搞不懂为什么会出现这个冲突。我的环境是WSL下的Linux,编译器用的gcc。
问题原因与解决办法
原因分析
- 依赖版本范围规则:Conan中心的spdlog/1.11.0对fmt的依赖大概率不是严格锁定9.1.0,而是一个宽松的版本范围(比如
>=9.1.0)。当你显式指定fmt/9.1.0时,可能存在其他间接依赖拉取了fmt/10.0.0,或者Conan的依赖解析逻辑优先选择了更高版本,导致冲突。 - 本地缓存干扰:如果之前本地Conan缓存里存过spdlog依赖fmt/10.0.0的记录,缓存会影响新的依赖解析结果。
- Conan版本差异:不同版本的Conan依赖解析逻辑可能有区别,比如旧版本的解析规则和Conan中心显示的依赖信息不匹配。
解决办法
- 强制绑定spdlog的fmt版本:修改
conanfile.py,给spdlog添加版本覆盖,强制它使用你指定的fmt/9.1.0:def requirements(self): self.requires("nlohmann_json/3.11.2") self.requires("spdlog/1.11.0", override="fmt") self.requires("fmt/9.1.0") self.requires("catch2/2.13.9") self.requires("cxxopts/3.1.1") - 清理本地缓存:执行
conan cache clean命令清空缓存,再重新安装依赖,避免旧缓存干扰。 - 排查完整依赖树:运行
conan info .查看所有直接、间接依赖的版本,找出到底是哪个包拉取了fmt/10.0.0,针对性调整。
内容的提问来源于stack exchange,提问作者Ramin Toussi
相关产品推荐
相关产品推荐

