交叉编译需严格匹配abi、sysroot与工具链,profile中漏配compiler.libcxx或tools.build:sysroot会导致链接时出现undefined reference to '__cxa_begin_catch'等错误;conan不自动推断libc++/libstdc++及浮点模式,arch=armv7与armv7hf不等价,cmaketoolchain需cmake 3.23+原生支持,否则find_package会误用宿主机库。

适合,但前提是 profile 配置必须严格匹配目标板的 ABI、sysroot 和工具链——漏掉 compiler.libcxx 或 tools.build:sysroot,编译能过,链接时会报 undefined reference to `__cxa_begin_catch' 这类符号错误。
profile 必须显式声明 ABI 和 libc 细节
嵌入式场景下,gcc 和 g++ 的 C++ ABI(尤其是异常/RTTI)高度依赖 compiler.libcxx 和 compiler.version。Conan 不会自动推断你用的是 libstdc++ 还是 libc++,也不会猜你是否启用了硬浮点。
-
compiler.libcxx=libstdc++11和compiler.libcxx=libstdc++是不同 ABI,混用会导致运行时崩溃 - ARM Cortex-M 系列若用 newlib,需额外加
os.sdk=none,否则 Conan 会尝试注入 glibc 相关宏 -
arch=armv7和arch=armv7hf在某些 SDK 中不等价,后者隐含-mfloat-abi=hard,profile 里写错就找不到 sysroot 下的libstdc++.a
CMakeToolchain 生成的 toolchain 文件必须被 CMake 正确加载
Conan 2.x 默认生成 conan_toolchain.cmake,但它只在 CMake 3.23+ 中被 -DCMAKE_TOOLCHAIN_FILE= 原生支持。低于该版本,CMake 会忽略 CMAKE_SYSTEM_PROCESSOR 设置,导致 find_package(OpenSSL) 找到宿主机的库。
- 检查 CMake 版本:
cmake --version,低于 3.23 就得手动 patchconan_toolchain.cmake,把set(CMAKE_SYSTEM_NAME "Linux")提前到project()之前 - 确保
conan install时传了--profile:host=profiles/arm64-release,而不是只传--profile=...—— 后者会被当成 build host profile,CMakeToolchain 会生成 x86_64 工具链 - 如果 SDK 自带
env-setup.sh,别 source 它;Conan 要求所有交叉信息来自 profile,环境变量会污染CC/CXX推导逻辑
OpenSSL 等关键依赖的配方必须禁用动态加载插件
嵌入式设备通常无文件系统或仅只读挂载,而 OpenSSL 3.x 默认启用 engines 动态加载,会尝试打开 /usr/lib/engines-3 —— 这个路径在 target 上根本不存在,导致初始化失败。
- 在
conanfile.txt中加约束:[options] openssl:shared=False openssl:no_engines=True openssl:enable_threads=False - 不要依赖 ConanCenter 的预编译二进制;嵌入式用的 OpenSSL 往往要关掉
zlib、asm、deprecated,这些只能靠本地 recipe 或--build=openssl重编 - 证书路径也得硬编码:通过
openssl:openssldir="/etc/ssl"控制,否则运行时报error:02001002:system library:fopen:No such file or directory
最常被忽略的一点:Conan 的 settings.yml 默认不包含 os.sdk 或 os.subsystem,但很多嵌入式 SDK(如 Yocto、Buildroot)需要这两个字段来区分 linux 和 linux-uclibc。得手动扩展会报错,不扩展则 profile 里写的设置会被静默丢弃。











