conan 2.x交叉编译必须将cc/cxx置于[buildenv]下,因[env]段已失效;若错放会导致仍用宿主机编译器,引发“不支持armv8”等错误。

交叉编译时 profile 中的 CC 和 CXX 必须放在 [buildenv] 下
Conan 2.x 不再识别旧版的 [env] 段,如果把 CC=aarch64-linux-gnu-gcc 写在 [env] 里,它根本不会生效——你 build 出来的还是本地 x86_64 的二进制,openssl 或 boost 这类依赖会直接 fallback 到 host 编译器,报错提示“不支持 armv8”就是典型症状。
正确写法是:
[buildenv] CC=/opt/toolchains/aarch64-poky-linux/bin/aarch64-poky-linux-gcc CXX=/opt/toolchains/aarch64-poky-linux/bin/aarch64-poky-linux-g++ LD=/opt/toolchains/aarch64-poky-linux/bin/aarch64-poky-linux-ld
-
[buildenv]中的变量只在构建阶段注入,不影响 Conan 自身运行(比如conan install命令本身仍用 host Python 和 host CMake) - 路径必须绝对且可执行,建议先手动
ls -l确认存在、有执行权限 - 不要依赖
$PATH查找,Conan 不会 shell 层展开环境变量链
tools.cmake.cmaketoolchain:user_toolchain 是复用现有 CMake 工具链最稳的方式
如果你已有成熟的 toolchain.cmake(比如 Yocto/Poky 或 DS-5 提供的),直接让 Conan 复用它,比手写 [buildenv] 更可靠——所有 CMAKE_SYSTEM_NAME、CMAKE_SYSROOT、CMAKE_FIND_ROOT_PATH 等细节都已封装好,不用自己拼接 PKG_CONFIG_SYSROOT_DIR 或 --sysroot 标志。
profile 中只需加一行:
[conf] tools.cmake.cmaketoolchain:user_toolchain=/opt/toolchains/aarch64-poky-linux/toolchain.cmake
- 该配置会自动触发
CMakeToolchain生成器跳过默认逻辑,直接 include 你指定的文件 - 注意:此时
[buildenv]中的CC/CXX可以删掉,否则可能和 toolchain.cmake 冲突(CMake 优先级更高) - 适用于已有大型嵌入式项目迁移场景,避免为 Conan 单独维护两套工具链定义
compiler settings 和 [buildenv] 必须逻辑一致
Conan 要求 [settings] 里声明的 compiler 类型(如 gcc)、版本(如 9)、libcxx(如 libstdc++11)必须与实际交叉编译器能力匹配。否则 conan install 阶段就会拒绝使用预编译二进制,甚至跳过某些包的兼容性检查。
常见不一致情形:
-
compiler=gcc但CC=clang→ Conan 认为你是 GCC 工具链,却传给 Clang 参数,链接失败 -
compiler.libcxx=libstdc++11但交叉工具链只带libc++→ 编译通过,链接时报undefined reference to __cxa_throw -
arch=armv7但CXX是aarch64-开头 → 架构声明和实际工具链不匹配,CMake configure 阶段就报CMAKE_SYSTEM_PROCESSOR not set
静态链接时 self.options["*"].shared = False 不够,还得关掉 runtime
设 shared=False 只控制 Conan 包自身是否编译成 .a,不影响它依赖的系统库(如 libpthread、libm)是否动态链接。嵌入式场景常要求全静态,这时要额外干预:
- 在 profile 的
[conf]中加:tools.build:sharedlinkflags=["-static"],确保链接器加-static - 若用
user_toolchain,需确认其内部已设置set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") -
compiler.runtime设置为static(仅 MSVC/Windows 场景有效;GCC/Clang 下靠 linker flags 控制)
最容易被忽略的是:即使所有 flag 都对了,pkg-config 返回的 .pc 文件若自带 -lpthread,仍会导致动态链接——这时候得靠 PKG_CONFIG_ALLOW_CROSS=1 + PKG_CONFIG_SYSROOT_DIR 强制它返回 sysroot 下的路径,再配合 -static 才真正闭环。











