conan 2.x 强制使用 cmakedeps + cmaketoolchain 替代已弃用的 conanbuildinfo.cmake,因其不支持多配置、config 模式及依赖传递,且 conan_basic_setup 等已移除;迁移需删旧引用、改生成器、更新 find_package(config) 调用,并注意 libcxx/cppstd 和大小写匹配。

直接停用 conanbuildinfo.cmake,改用 CMakeDeps + CMakeToolchain 生成器,是 Conan 2.x 的标准路径;旧方式在 Conan 2.0+ 中已弃用,继续用会导致 find_package() 找不到包或链接失败。
为什么 conanbuildinfo.cmake 不再适用
Conan 1.x 依赖 conanbuildinfo.cmake 提供全局变量(如 ${CONAN_LIBS})和宏(如 conan_basic_setup()),但这种方式无法区分多配置构建、不支持现代 CMake 的 CONFIG 模式查找,且与 target_link_libraries() 的粒度不匹配。Conan 2.x 彻底移除了该机制,强制转向基于 find_package(... CONFIG) 的标准 CMake 集成。
-
conan_basic_setup()在 Conan 2.x 中已不存在,调用会报错Unknown CMake command "conan_basic_setup" - 即使手动保留旧文件,
CONAN_INCLUDE_DIRS等变量也不再由 Conan 自动更新,极易导致头文件路径缺失 - 无法正确处理依赖传递:比如 A 依赖 B,B 依赖 Z,旧方式常漏掉 Z 的 include 或 link 项
替换步骤:三步完成迁移
核心动作是删旧、换生成器、改 CMakeLists.txt —— 不需要重写整个构建逻辑。
CMake 4.3.2 Windows x86_64 历史版本安装包,适合旧项目兼容、构建环境回退、CMakeLists.txt 迁移验证、Visual Studio/Ninja/Makefile 生成器测试和 C/C++ 项目维护。
- 删除项目中所有对
conanbuildinfo.cmake的引用,包括:include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)和conan_basic_setup()调用 - 将
conanfile.txt或conanfile.py中的[generators]改为:[generators] CMakeDeps CMakeToolchain
(注意:不是cmake_find_package,那是 Conan 1.x 的过渡方案) - 修改
CMakeLists.txt:
– 删除旧的include(conanbuildinfo.cmake)行
– 在project()后立即添加:include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake)
– 将每个find_package(Xxx)改为带CONFIG限定:find_package(Xxx REQUIRED CONFIG)
– 链接时仍用target_link_libraries(target PRIVATE Xxx::Xxx),无需改动
conan install 命令必须同步更新
旧命令 conan install . --build=missing 仍可用,但若你之前靠 --install-folder 控制输出位置,现在必须明确指向 CMakeToolchain 生成目录(通常是 build/),否则 conan_toolchain.cmake 找不到。
- 推荐统一使用:
conan install . --output-folder=build --build=missing -s build_type=Release - 确保
-s build_type与后续cmake -DCMAKE_BUILD_TYPE=Release一致,否则CMakeToolchain生成的编译器标志(如-O3)和CMakeDeps选中的库 ABI 不匹配 - Linux/macOS 下若用 Ninja 或 Makefiles,
build_type必须显式传给conan install;Windows MSVC 用户可省略,但建议保留以保持跨平台一致性
最容易被忽略的兼容性坑
迁移后编译失败,90% 出在两处:一是 C++ 标准版本未对齐,二是 compiler.libcxx 设置缺失。Conan 2.x 默认不推断 libcxx,而旧 conanbuildinfo 会隐式适配。
- 如果你用 GCC 11+ 或 Clang,必须在
conan install中加:-s compiler.libcxx=libstdc++11(Linux)或-s compiler.libcxx=libc++(macOS) - 如果代码用了 C++17 特性(如
std::optional),需同步指定:-s compiler.cppstd=17,否则CMakeToolchain生成的-std=gnu++14会触发编译错误 -
CMakeDeps生成的XxxConfig.cmake文件名严格匹配包名大小写(如fmt→fmtConfig.cmake),但某些旧项目里写了find_package(Fmt),这会失败 —— 必须小写










