cmakepresets.json 不支持直接使用 conan profile,需手动将 profile 中的 settings 和 conf 映射为 cmake 可识别的 cachevariables、environment 或 preset 字段(如 cmake_system_name、architecture、toolset 等),且 conan install 必须先于 cmake --preset 执行以生成 toolchain 和 deps 文件。

CMakePresets.json 本身不认 Conan Profile,必须手动桥接
Conan 的 profile 是独立于 CMake 的配置单元,CMakePresets 不会自动读取或解析它。你不能在 cmakePresets.json 里写 "conan_profile": "ios-arm64" 这类字段——CMake 压根不认识。真正起作用的是:把 profile 中的关键设置(如 compiler、build_type、CMAKE_SYSTEM_NAME 等)显式映射成 CMake 可识别的参数,再塞进 preset 的 cacheVariables 或 environment 里。
profile 设置必须转成 CMake cache 变量才生效
比如你的 Conan profile ios-arm64 里有:
[settings] os=iOS arch=arm64 compiler=apple-clang compiler.version=15 compiler.libcxx=libc++ build_type=Release [conf] tools.cmake.cmaketoolchain:generator=Xcode
这些不能直接用。你需要在 cmakePresets.json 的 preset 中等价写出:
"CMAKE_SYSTEM_NAME": "iOS""CMAKE_OSX_ARCHITECTURES": "arm64""CMAKE_OSX_SYSROOT": "iphoneos""CMAKE_OSX_DEPLOYMENT_TARGET": "12.0"-
"CMAKE_BUILD_TYPE": "Release"(仅对单配置生成器有效) -
"CMAKE_TOOLCHAIN_FILE": "build/_deps/conan_toolchain.cmake"(由conan install生成)
注意:CMAKE_BUILD_TYPE 在 Xcode/Visual Studio 这类多配置生成器下会被忽略,此时要靠 conan install --config Release 配合 conanfile.py 中的 self.settings.build_type 控制最终链接行为。
conan install 必须在 cmake configure 前单独运行
CMakePresets 不会帮你调 conan install。常见错误是只配了 preset 却忘了这步,导致 CMakeDeps 和 CMakeToolchain 文件缺失,find_package() 直接失败。
正确流程是两步分离:
- 先运行:
conan install . --profile:build=default --profile:host=ios-arm64 -g CMakeDeps -g CMakeToolchain -s build_type=Release - 再运行:
cmake --preset ios-arm64(该 preset 指向已生成的conan_toolchain.cmake)
如果你用 conanfile.py,还要确保 layout() 返回的 build_folder 和 preset 中的 binaryDir 一致,否则 conan_toolchain.cmake 路径对不上。
Windows + MSVC 场景下容易漏掉 TOOLSET 和 ARCH
Conan profile 可能设了 compiler.toolset=v143 和 arch=x86_64,但 CMakePresets 若没显式传 -A x64 和 -T v143,Visual Studio 生成器会默认用旧版 toolset 或选错架构。
必须在 preset 的 configurePresets 中补全:
-
"architecture": "x64"(对应-A x64) -
"toolset": "v143"(对应-T v143) -
"cacheVariables": { "CMAKE_GENERATOR_TOOLSET": "v143" }(部分旧版 CMake 需要这个)
漏掉任一者都可能导致生成的 sln 项目无法加载,或编译时提示 MSB8020 错误。
真正麻烦的地方不在 preset 写法,而在于 profile 和 preset 之间没有自动映射表——每个新平台 profile 都得人工核对 CMake 所需变量名、值格式、是否大小写敏感(比如 iOS ≠ ios),稍有不一致就静默失败或构建出错。建议把常用 profile 对应的 preset 片段做成模板存档,避免每次重推导。











