Conan 是一个开源、跨平台的 C/C++ 依赖和包管理器,旨在解决 C/C++ 项目依赖管理的碎片化问题。它通过中心化的方式获取、构建并集成所需的第三方库,能极大地提高开发效率和项目可维护性。
Conan 把「谁编、用什么链、要什么版本」写成文件,进仓库;需要手搓的命令,改成一条流程。
手工编译时,其实你一直在盯这四件事
手工编 ≠ 只用一条 Configure。你其实在同时盯住四件事:ABI(软/硬浮点等)、rootfs/sysroot 是否合拍、和其它库会不会 两套 OpenSSL 混装、三个月后 谁能复现。漏一个,就出现「我这里能链 / 你那红」。
手工阶段,需要注意四个问题:
换成 Conan,同一类事变成可查的文件和流程——从口头上「收口」到仓库里能看见:
三件事先说清:Recipe、Profile、生成器
| 叫法 | 人话 |
|---|---|
| Recipe 配方 | 这包 OpenSSL「怎么下源码、开关怎么开、吐出啥」 |
| Profile | 「用哪把交叉刀、给谁编」——前缀、架构、libc、编译选项 |
| 生成器 Generator | 告诉 CMake/Makefile:头文件和库到哪找(如 CMakeDeps + CMakeToolchain) |
OpenSSL 待在栈里的哪一环(升级不单是换路径)
升级 OpenSSL 不是换目录:协议栈、libssl/静态链、证书路径、有没有动态加载插件,都要心里过一遍。
动手跑通(Conan 2 + CMake 链接 OpenSSL)
第 1 步:准备一个交叉 Profile(示例骨架)
在项目里放一个纯文本 Profile,例如 profiles/arm64-release,核心是:编译器前缀、必要时 sysroot、以及 arch/os/compiler 与板子一致。不要和环境里残留的 CC 混着来。
示例(按需改前缀和路径——路径别照抄):
[settings]
arch=armv8
build_type=Release
compiler=gcc
compiler.cppstd=17
compiler.libcxx=libstdc++
compiler.version=12
os=Linux
[conf]
tools.cmake.cmaketoolchain:generator=Ninja
[buildenv]
CC=aarch64-none-linux-gnu-gcc
CXX=aarch64-none-linux-gnu-g++
# 若用你的 SDK 的根文件系统当 sysroot:
# tools.build:sysroot=/path/to/your/sysroot (写法随 Conan/SDK 微调)
第 2 步:conanfile.txt 声明要 OpenSSL + 生成器
放在工程根或与 CMake 同级、你习惯的位置:
[requires]
openssl/3.3.2
[generators]
CMakeDeps
CMakeToolchain
版本号改成团队锁定的那一个;是否要 zlib 等由 openssl 配方决定,--build=missing 会在缺二进制时帮你编。
第 3 步:conan install:拉依赖 + 吐 CMake 用文件
在工程目录执行(-host 用你的交叉 Profile;-pr:b default 表示「给 Conan 自己要跑的小工具用手本机」,常见写法——若你公司有固定模板跟着走即可):
conan install . --output-folder=build -pr:h=profiles/arm64-release -pr:b=default --build=missing
生成的东西落在 build 里,CMake 要指过去。
第 4 步:CMakeLists 两件事
find_package(OpenSSL REQUIRED)
target_link_libraries(你的目标 PRIVATE OpenSSL::SSL OpenSSL::Crypto)
再在 build 目录/configure 时载入 Conan toolchain,例如 Conan 生成的 build/conan_toolchain.cmake,把下面命令里的文件名和你在 install 后实际看到的对齐即可:
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=build/conan_toolchain.cmake
cmake --build build
conan install 之后:磁盘上多出什么(关系图)
进 git 的是 profile + conanfile,不是整个 OpenSSL 源码树(除非你有意 vendor)。
从写好 Profile 到板子冒烟
链接失败或运行异常:按这个顺序查
不用堆理论,直接按顺序排:动态链时,
ldd 你的程序 在真机上看一眼。
适合你吗?读完建议先做的一步
这些情况先别急着上 Conan
嵌入式 Linux + 多方协作 + OpenSSL:常常值。MCU 裸机、或整机镜像被 Yocto 锁死且禁止第二套 openssl:先跟镜像负责人对齐「唯一真相源」,别自行再塞一层。
上板与发版前:五项自检
Profile、conanfile、OPENSSL 版本写进 README 或一页 wiki。新员工按文档
不靠私聊 能
install + 链过。动态链:
rootfs 里的
libssl.so /
SONAME 和编出来的一致。Conan 1 / 2
别混着说,团队统一一条文档链接。
小结
手搓最大的问题不是命令长,是状态和人不在一起。先用「一个最小 CMake 程序 + openssl + 交叉 Profile」把闭环跑绿,再上 CI;这比先开大道理会省事得多。MCU、或 Yocto 已垄断镜像时,换一个战场谈「谁在镜像里控盘」——工具永远服从交付链。
一份打通“应用→驱动”的Linux底层修炼指南!
300