news 2026/4/15 12:48:45

蓝易云 - ubuntu上安装boost库为SOMEIP的X86和ARM下编译做准备(编译两种版本)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
蓝易云 - ubuntu上安装boost库为SOMEIP的X86和ARM下编译做准备(编译两种版本)

下面给你一套在 Ubuntu 上把 Boost 做成x86_64ARM64(aarch64)两套产物的标准化方案,用于后续 SOME/IP(如 vsomeip)在两种架构下编译与打包准备。重点是:两套库完全隔离、可复现、可交付。🙂


方案选择(先把路选对)

方案适用场景优点风险点
A:各自机器本机编译(x86 主机编 x86;ARM 板子编 ARM)你有 ARM 真机/开发板最省心、兼容性最好ARM 端编译慢
B:x86 主机交叉编译 ARM(生成 aarch64 Boost)你想在一台 x86 上出两套产物产物统一、流水线友好需要交叉编译器与(最好有)sysroot

建议企业交付用B:一次构建,两套交付;但第一次搭环境要更严谨。


1)安装基础依赖(两种方案都要)

sudo apt update sudo apt install -y build-essential git cmake ninja-build pkg-config python3
  • build-essential:提供 gcc/g++/make,Boost 编译的“地基”

  • cmake/ninja:后续 SOME/IP 项目常用构建工具

  • pkg-config:让依赖发现更稳定

  • python3:部分构建/脚本会用到


2)安装 ARM64 交叉编译器(仅方案 B 需要)🧰

sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
  • 解释:安装aarch64-linux-gnu-g++,用于在 x86 上生成 ARM64 目标文件

  • 直白点说:没有它,你让 x86 去“假装”编 ARM,系统只会礼貌地崩给你看。


3)准备 Boost 源码(建议源码编译以锁定版本与路径)

把 Boost 源码解压到某个目录(版本按你项目需要选,关键是一致):

tar -xf boost_*.tar.* cd boost_*/
  • 解释:源码编译的价值是输出路径可控、两套架构不会互相污染


4)编译 x86_64 版本(输出到独立前缀)✅

./bootstrap.sh --prefix=/opt/boost/x86_64
  • --prefix:安装路径前缀,保证x86_64与 ARM 彻底隔离

./b2 -j"$(nproc)" variant=release threading=multi link=static runtime-link=shared \ --with-system --with-thread --with-filesystem --with-program_options --with-chrono install
  • -j$(nproc):按 CPU 核数并行编译,提高效率

  • variant=release:出 release 库,适合生产编译链

  • threading=multi:多线程库支持

  • link=static:生成静态库,交付更“可控”(你也可改 shared)

  • runtime-link=shared:运行时链接策略(减少重复体积)

  • --with-*:只编常用组件(SOME/IP 常见会用到 system/thread 等;按项目实际增减)

  • install:把结果装进/opt/boost/x86_64


5)交叉编译 ARM64 版本(方案 B 核心)🚀

先写 Boost.Build 的工具链配置文件:

cat > user-config.jam <<'EOF' using gcc : aarch64 : aarch64-linux-gnu-g++ ; EOF
  • 解释:告诉 b2 “ARM64 用哪把 g++”,否则它默认走宿主机编译器

然后编译并安装到 ARM 专属目录:

./b2 -j"$(nproc)" --user-config=./user-config.jam toolset=gcc-aarch64 \ target-os=linux architecture=arm address-model=64 abi=aapcs \ variant=release threading=multi link=static runtime-link=shared \ --prefix=/opt/boost/aarch64 \ --with-system --with-thread --with-filesystem --with-program_options --with-chrono install
  • toolset=gcc-aarch64:使用上面定义的 aarch64 工具链

  • architecture=arm address-model=64:明确目标是ARM64

  • abi=aapcs:ARM Linux 常见 ABI 约定

  • --prefix=/opt/boost/aarch64:ARM 产物落地目录,保持隔离

如果你的 ARM 目标环境用了特定 rootfs(强烈建议),可追加:
cxxflags="--sysroot=/path/to/sysroot" linkflags="--sysroot=/path/to/sysroot"
解释:让头文件/库解析与目标系统一致,减少“能编过但跑不起来”的灰色问题。


6)快速验收:确认“库确实是对应架构”

若你编的是.so(shared),可以这样看:

readelf -h /opt/boost/aarch64/lib/libboost_system.so | grep Machine
  • 解释:Machine应显示 AArch64;如果显示 x86-64,说明你交叉编译链没生效

(静态库.a不好直接看 Machine,建议临时编个小测试链接成可执行再file。)


7)给 SOME/IP 项目(如 CMake)指路:别让它乱找系统 Boost

x86_64 编译时:

export BOOST_ROOT=/opt/boost/x86_64 export Boost_NO_SYSTEM_PATHS=ON
  • 解释:强制项目使用你指定的 Boost,而不是系统自带版本(避免“你以为用的是 A,其实链接了 B”)

ARM64 交叉编译时:

  • 在你的 toolchain 文件里指定交叉编译器,并把BOOST_ROOT指向/opt/boost/aarch64

  • 解释:不要混用,x86 的 Boost 给 ARM 链接,100% 会炸,只是炸得早晚不同。


工作流程图(vditor/Markdown 兼容)

flowchart TD A[安装依赖] --> B{是否需要交叉编译ARM?} B -- 否 --> C[在x86/ARM各自机器本机编译Boost] B -- 是 --> D[安装aarch64交叉编译器] D --> E[bootstrap设置x86 prefix并编译安装] E --> F[配置user-config.jam指定aarch64 g++] F --> G[b2交叉编译ARM64并安装到aarch64 prefix] G --> H[验证架构readelf/file] H --> I[为SOME/IP项目配置BOOST_ROOT/Toolchain]

最后的务实提醒

  1. 两套产物路径必须隔离/opt/boost/x86_64/opt/boost/aarch64,否则后期排查链接问题会非常痛苦。

  2. 交付侧优先静态库link=static,能显著降低目标机“缺库地狱”。

  3. 如果你告诉我:目标是ARM32 还是 ARM64、SOME/IP 项目用CMake 还是 Autotools、是否有sysroot/rootfs,我可以把参数收敛到更“刚性”的一套(更适合流水线与可重复构建)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 21:32:57

Zabbix社区模板:企业级监控系统的终极资源库

Zabbix社区模板&#xff1a;企业级监控系统的终极资源库 【免费下载链接】community-templates Zabbix Community Templates repository 项目地址: https://gitcode.com/gh_mirrors/co/community-templates Zabbix社区模板为企业监控系统提供了丰富的预配置方案&#xf…

作者头像 李华
网站建设 2026/4/13 15:13:20

AI医学图像分割工具:nnUNet快速上手终极指南

什么是nnUNet&#xff1f; 【免费下载链接】nnUNet 项目地址: https://gitcode.com/gh_mirrors/nn/nnUNet nnUNet是由德国癌症研究中心开发的智能医学图像分割框架&#xff0c;专为简化深度学习在医疗影像分析中的应用而生。它是一个能够自动适应不同数据集的自配置语义…

作者头像 李华
网站建设 2026/4/14 6:13:49

4、网络配置与规则管理全解析

网络配置与规则管理全解析 1. 简单规则集的重要性 在网络配置中,对于简单的设置,接口绑定的进出规则可能会让规则集变得复杂,而不是更有价值。对于忙碌的网络管理员来说,易读的规则集才是更安全的规则集。为了提高可读性,后续我们会尽可能让规则保持简单。不过,在某些情…

作者头像 李华
网站建设 2026/3/27 15:58:18

11、主动防御与网络流量管理

主动防御与网络流量管理 1. 主动防御:垃圾邮件检测与处理 1.1 检测无序 MX 使用 OpenBSD 4.1 引入了 spamd 检测无序 MX 使用的功能。垃圾邮件发送者常采用先联系辅助邮件交换器而非主邮件交换器的技巧,这与普通邮件传输代理的行为相悖。例如,对于 example.com 域名,主邮…

作者头像 李华
网站建设 2026/4/15 7:09:54

2、深入了解PF:功能、配置与应用

深入了解PF:功能、配置与应用 1. PF概述 PF(Packet Filter)作为一种数据包过滤系统,从版本5.3开始以包的形式被纳入基础系统。它也被包含在NetBSD和DragonFly BSD中。本文主要聚焦于OpenBSD 4.2中可用的最新PF版本。 PF是一种数据包过滤器,其代码主要在协议和端口层面检…

作者头像 李华
网站建设 2026/4/3 5:51:35

Transformer训练资源优化:从单卡到集群的完整实战指南

训练成本超预算&#xff1f;GPU显存频频告急&#xff1f;项目deadline迫在眉睫却因计算资源不足而停滞&#xff1f;这几乎是每个AI开发者都会遇到的痛点。本文将深度解析Transformer类模型在训练过程中的资源消耗规律&#xff0c;并提供一套完整的优化策略&#xff0c;帮助你在…

作者头像 李华