conan 2.x 在 macos 上需严格对齐 cmakedeps/cmaketoolchain 生成器与 cmake 配置时机,关键步骤包括:指定匹配 arm64/x86_64 的 profile、使用 --output-folder=build、声明 cmake_layout、通过 -dcmake_toolchain_file 启用 toolchain,并在 cmakelists.txt 中正确 include 和 find_package。

Conan 2.x 在 macOS 上和 CMake 集成,核心不是“装完就能用”,而是必须对齐生成器(CMakeDeps + CMakeToolchain)和 CMake 的 include 时机 —— 错一步,find_package(fmt) 就报 Could not find a package configuration file。
conan install 必须带 --build=missing 且指定 profile
macOS 上默认 profile(default)可能没设好编译器或架构,尤其 Apple Silicon(arm64)下容易出错。不显式指定,conan install 可能拉来 x86_64 二进制,链接失败。
- 先确认当前 profile:
conan profile show default,检查os是Macos、arch是arm64或x86_64、compiler是apple-clang - 若不匹配,新建 profile:
conan profile new macos-arm64 --detect,再手动修正compiler.version(如15)和compiler.cppstd(如17) - 执行安装时绑定 profile:
conan install . --output-folder=build --build=missing --profile=macos-arm64 -
--output-folder=build是关键:它让 Conan 把CMakeDeps和CMakeToolchain全扔进build/目录,后续 CMake 才能找到
CMakeLists.txt 里不能用 conan_basic_setup()
这是 Conan 1.x 的写法,Conan 2.x 已废弃。继续用会导致 CONAN_LIBS 未定义、target_link_libraries 失败,且和 CMakeDeps 冲突。
- 删掉所有
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)和conan_basic_setup() - 改用 Conan 2.x 推荐方式:
include(${CMAKE_CURRENT_LIST_DIR}/build/generators/conan_toolchain.cmake)(路径必须和conan install --output-folder一致) - 在
add_executable后,用find_package(fmt CONFIG REQUIRED),再target_link_libraries(hello_world PRIVATE fmt::fmt) - 注意:
find_package的名字(fmt)必须和conanfile.txt里[requires]的库名一致,大小写敏感
conanfile.txt 必须声明 [layout] cmake_layout
否则 CMakeToolchain 生成的路径可能错位,导致 CMake 找不到 conan_toolchain.cmake,报 File not found。
- 完整最小
conanfile.txt示例:
[requires] fmt/10.2.1 [generators] CMakeDeps CMakeToolchain [layout] cmake_layout
-
cmake_layout会自动把构建输出映射到build/下,并让CMakeToolchain输出到build/generators/ - 如果项目结构是
src/main.cpp,cmake_layout还会把源码路径设为source_folder=.,避免source目录被误判 - 不用
[layout]?那就得手动在CMakeLists.txt里写死路径,比如include(${CMAKE_CURRENT_LIST_DIR}/build/Release/generators/conan_toolchain.cmake),但 Release/Debug 路径又得手动切
CMake 配置命令必须加 -DCMAKE_TOOLCHAIN_FILE
只靠 include(...conan_toolchain.cmake) 不够 —— CMake 启动时若没加载 toolchain,set(CMAKE_CXX_STANDARD 17) 等设置会被覆盖,最终编译用上 C++98。
- 正确调用方式(在
build/目录下执行):
cmake .. -DCMAKE_TOOLCHAIN_FILE=generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
-
-DCMAKE_TOOLCHAIN_FILE必须指向conan_toolchain.cmake,不是conanbuildinfo.cmake - 这个参数会让 CMake 在 configure 阶段就应用 Conan 设置的编译器、标准、flags,比
include更早、更底层 - VSCode + CMake Tools 插件用户:在
settings.json里加"cmake.configureArgs": ["-DCMAKE_TOOLCHAIN_FILE=generators/conan_toolchain.cmake"],否则 GUI 点击 configure 会失效
最易忽略的一点:Conan 2.x 的 CMakeToolchain 生成的是跨平台、多配置感知的文件,但它不会自动切换 Debug/Release;你得自己在 CMake 命令里明确传 -DCMAKE_BUILD_TYPE,否则默认是 None,链接时可能混用不同 build_type 的依赖。











