conan交叉编译必须显式区分host与build profile:-pr:h指定目标平台(如arm64),-pr:b指定构建机工具链(如x86_64 gcc),否则将导致编译器误用、sysroot错乱及生成器输出错误;build_type、compiler.libcxx和compiler.version须与目标sysroot严格对齐,且cmake生成器需与构建类型完全匹配。

conan install 时 profile 的 host/build 分离必须明确
跨平台构建中,conan install 默认只用一个 profile(即 host profile),但当你交叉编译(比如在 x86_64 Linux 上编译 arm64 嵌入式固件)时,必须显式区分:-pr:h 指定目标平台(host),-pr:b 指定构建机工具链(build)。漏掉 -pr:b 或混用,会导致:
- 编译器被误用:宿主机
gcc去编译目标头文件,报error: unknown type name 'size_t' - sysroot 路径错乱:Conan 把 host 的 libc 头和 build 的 binutils 拼在一起,链接时找不到
__aeabi_memcpy - 生成器(如
CMakeToolchain)输出错误的CMAKE_SYSTEM_PROCESSOR和CMAKE_C_COMPILER
正确做法是为每个角色单独写 profile 文件,且不复用同一份内容——哪怕只是改了 arch 或 compiler.version,也应视为不同 profile。
build_type=Debug 和 Release 不能在依赖图中混链
Conan 的 build_type 是 settings 维度,直接参与 package ID 计算。这意味着:
-
openssl/3.2.1在build_type=Debug下生成的包,和build_type=Release下的是两个完全不同的二进制,ID 不同、符号表不同、优化开关不同 - 如果你的主项目用
build_type=Debug,但某个依赖(比如zlib)只上传了 Release 二进制,Conan 不会自动 fallback,而是报错Cannot find a valid package for requirement zlib/1.2.13 - 更隐蔽的问题:混合链接 Debug 主程序 + Release 依赖,可能触发
std::stringABI 不兼容(尤其在 libstdc++ vs libc++ 切换时)
解决方案不是“手动指定”,而是统一用 --build=missing 并确保所有依赖 recipe 支持你所需的 build_type;或者用锁文件(conan.lock)固化整张图的配置。
compiler.libcxx 和 compiler.version 必须与目标 sysroot 对齐
这是嵌入式和跨 Linux 发行版场景中最常踩的坑。例如:
- profile 中设
compiler.libcxx=libstdc++11,但 sysroot 里只有libstdc++.so.6.0.28(对应 GCC 11),而你本地CC实际调用的是 GCC 12 —— 编译能过,链接时报undefined reference to 'std::__cxx11::basic_string...' - ARM profile 写
compiler=gcc却没配compiler.version,Conan 可能按默认 11 来选 OpenSSL 二进制,但你的交叉工具链是 GCC 12,导致OPENSSL_API_COMPAT宏不匹配、函数签名对不上 - macOS 上用
compiler=apple-clang但compiler.version=15,而 Xcode CLI 工具实际是 16 ——CMakeToolchain生成的MACOSX_DEPLOYMENT_TARGET错位,运行时报 dyld error
关键判断依据不是“能不能跑通第一条命令”,而是检查 conan install 输出末尾的 Package ID 字符串是否含 libstdc++11 和你期望的 gcc-12 标识;同时确认 sysroot/usr/include/c++ 下的路径名与 profile 中的 compiler.libcxx 一致。
CMake generator 与 CMake 构建类型必须匹配
CMakeDeps 和 CMakeToolchain 这两个生成器的行为,取决于你最终用什么方式调用 CMake:
- 用 Ninja / Makefiles(单配置):必须在
conan install时指定--build-type=Debug,且 CMake 命令里带-DCMAKE_BUILD_TYPE=Debug;否则find_package(fmt CONFIG)找不到对应 config 文件 - 用 Visual Studio(多配置):CMake 命令里**不能**加
-DCMAKE_BUILD_TYPE,而要在conan install时用--build-type=Debug+--settings build_type=Debug,后续cmake --build . --config Debug才能命中正确的 target - 若 profile 里
build_type=RelWithDebInfo,但 CMakeLists.txt 里硬写set(CMAKE_BUILD_TYPE Release),CMakeToolchain生成的conan_toolchain.cmake里CMAKE_CXX_FLAGS就不会包含-g,调试信息直接丢失
最稳妥的做法是:profile 中的 build_type 和 CMake 构建命令中的 --config 或 -DCMAKE_BUILD_TYPE 值严格一致,并在 CMakeLists.txt 开头就 include() Conan 生成的 toolchain,而不是靠后 patch。











