x86架构利用docker去编译arm64的应用程序
文章目录
- 1. 交叉编译:toolchain
- 2. 隔离挂载的方式:
- 3. QEMU 或其他模拟器来实际运行docker
x86架构实现多平台系统代码的编译,实现方式有多种:
- 交叉编译:toolchain 【新的第三方库不好处理】
- 隔离挂载的方式 【速度慢,文件系统会被干扰】
3. QEMU 或其他模拟器来实际运行docker [推荐]
1. 交叉编译:toolchain
https://github.com/dockcross/dockcross.git
toolchain-aarch64.cmake
# DO NOT EDIT THIS FILE
#
# To set up cross-compilation, create the file
# $(ROS_ROOT)/rostoolchain.cmake. It gets read first, prior to
# any of cmake's system tests.#############################################################
#
# An example for using the gumstix arm-linux toolchain is below.
# Copy these lines to $(ROS_ROOT)/rostoolchain.cmake to try them out.
#
#set(CMAKE_SYSTEM_NAME Linux)
#set(CMAKE_C_COMPILER /opt/arm-linux/bin/arm-linux-gcc)
#set(CMAKE_CXX_COMPILER /opt/arm-linux/bin/arm-linux-g++)
#set(CMAKE_FIND_ROOT_PATH /opt/arm-linux)
# Have to set this one to BOTH, to allow CMake to find rospack
#set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
#set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
#set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
#File rostoolchain.cmakeset(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm64)
set(CMAKE_SYSROOT /arm64)
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PATH /opt/ros/melodic /arm64)set(CMAKE_LIBRARY_PATH /arm64/usr/lib/aarch64-linux-gnu /arm64/usr/lib /arm64/lib /arm64/usr/local/lib)set(CMAKE_INCLUDE_PATH /arm64/usr/include /arm64/usr/local/include)
set(LD_LIBRARY_PATH /arm64/usr/lib/aarch64-linux-gnu /arm64/usr/lib /arm64/lib /arm64/usr/local/lib)set(PYTHON_EXECUTABLE /usr/bin/python)
set(PCL_ROOT /arm64/usr)set(CMAKE_CROSSCOMPILING true)# Have to set this one to BOTH, to allow CMake to find rospackset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
catkin_make install -DCMAKE_TOOLCHAIN_FILE=/xx/toolchain-aarch64.cmake -j4
2. 隔离挂载的方式:
ch-mount.sh -m arm64
ch-mount.sh -u arm64
拷贝arm64机器里面的对应库文件放x86电脑上去隔离
$ ls arm64/
Arm64Env arm64_xc.gz bin boot dev etc home lib lost+found mnt opt proc root sbin snap srv sys system tmp usr var
ch-mount.sh
#!/bin/bash
#
function mnt() {echo "MOUNTING"sudo mount -t proc /proc ${2}/procsudo mount -t sysfs /sys ${2}/syssudo mount -o bind /dev ${2}/devsudo mount -o bind /dev/pts ${2}/dev/pts
# sudo mount -o bind /run ${2}/run
# sudo mount -o bind /proc ${2}/proc
# sudo mount -o bind /sys ${2}/syssudo chroot ${2}
}
function umnt() {echo "UNMOUNTING"sudo umount ${2}/procsudo umount ${2}/syssudo umount ${2}/dev/ptssudo umount ${2}/dev
# sudo umount ${2}/run
}
if [ "$1" == "-m" ] && [ -n "$2" ] ;
thenmnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
thenumnt $1 $2
elseecho ""echo "Either 1'st, 2'nd or both parameters were missing"echo ""echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"echo ""echo "For example: ch-mount -m /media/sdcard/"echo ""echo 1st parameter : ${1}echo 2nd parameter : ${2}
fi
3. QEMU 或其他模拟器来实际运行docker
如果您在 x86 电脑上运行的 Docker 镜像已经是针对 arm64 架构的(例如,使用 FROM arm64v8/ubuntu 作为基础镜像),则您不需要配置交叉编译。这是因为 Docker 镜像本身已经包含了针对 arm64 的库和工具。
在这种情况下,您可以在 Docker 镜像中直接编译 arm64 程序。但是,请注意,您可能需要在宿主机上配置 QEMU 或其他模拟器来实际运行在 x86 电脑上的 arm64 Docker 镜像。否则,您可能会遇到兼容性问题,因为您正在尝试在 x86 架构的宿主机上运行 arm64 代码。
在运行 arm64 Docker 镜像时,Docker 会自动设置 QEMU 来模拟 arm64 架构。确保您的宿主机上安装了 QEMU 并启用了对应的二进制格式支持,以便正确运行这些镜像。
安装QEMU和支持库:
sudo apt-get install qemu-user-static binfmt-support
将QEMU的ARM64静态二进制文件复制到Dockerfile的当前目录:cp /usr/bin/qemu-aarch64-static .
在Dockerfile中添加以下指令以包含QEMU二进制文件:
COPY qemu-aarch64-static /usr/bin/
要确保您的宿主机上安装了 QEMU 并启用了对应的二进制格式支持,请按照以下步骤操作:首先,安装 QEMU。在基于 Debian 的系统(如 Ubuntu)上,您可以使用以下命令进行安装:sudo apt-get update
sudo apt-get install qemu qemu-user-static binfmt-support
在基于 RHEL 的系统(如 CentOS、Fedora)上,您可以使用以下命令进行安装:sudo yum install qemu qemu-user-static
接下来,验证 QEMU 是否已安装:qemu-system-aarch64 --version
如果成功安装,您应该会看到 QEMU 版本信息。确认 binfmt-support 服务是否启用:sudo systemctl status binfmt-support
如果服务未启用,请使用以下命令启用并启动服务:sudo systemctl enable binfmt-support
sudo systemctl start binfmt-support
最后,确保您的系统已注册了 ARM64 架构的二进制格式支持。运行以下命令:cat /proc/sys/fs/binfmt_misc/qemu-aarch64
如果已启用支持,您应该会看到包含 "flags: F" 和 "interpreter /usr/bin/qemu-aarch64-static" 的输出。完成这些步骤后,您的宿主机应已准备好运行 ARM64 架构的 Docker 镜像。这意味着您可以在这些镜像中直接编译 ARM64 程序,而无需配置交叉编译。
Dockerfile.arm64_melodic
FROM arm64v8/ros:melodic-perceptionENV WS=/home/xx/yy
COPY start.sh /home/xx/yy/COPY qemu-aarch64-static /usr/bin/
COPY sources.list.arm /etc/apt/sources.list
COPY ros.asc /etc/RUN apt-get install -y build-essentialRUN sh -c '. /etc/lsb-release && echo "deb http://mirrors.sjtug.sjtu.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list' && \apt-key add /etc/ros.asc
#RUN apt-key adv --keyserver keys.gnupg.net --recv-key 6F3EFCDE
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C8B3A55A6F3EFCDE
RUN apt update
RUN apt-get install -y ros-melodic-desktop-full
RUN apt-get install -y python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential python-catkin-tools python3-vcstool
RUN apt-get install -y ros-melodic-ecl libgoogle-glog-dev libgflags-dev libbullet-dev libsdl2-dev zstd libsdl-image1.2-dev libsdl-dev
RUN apt-get install -y ros-melodic-tf2-geometry-msgs ros-melodic-tf2-sensor-msgs ros-melodic-urdf \ros-melodic-usb-cam ros-melodic-rgbd-launch ros-melodic-libuvc ros-melodic-libuvc-camera ros-melodic-libuvc-ros \ros-melodic-move-base-msgs ros-melodic-kobuki-msgs libfcl-dev ros-melodic-bfl ros-melodic-pcl-ros libpcl-dev
RUN mv /usr/include/flann/ext/lz4.h /usr/include/flann/ext/lz4.h.bak && \mv /usr/include/flann/ext/lz4hc.h /usr/include/flann/ext/lz4.hc.bak && \ln -s /usr/include/lz4.h /usr/include/flann/ext/lz4.h && \ln -s /usr/include/lz4hc.h /usr/include/flann/ext/lz4hc.hRUN echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrcRUN apt-get install -y ros-melodic-qt-build libevent-dev gcc g++ gfortran git cmake liblapack-dev pkg-config swig ipython python-dev python-numpy python-scipy python-matplotlib --install-recommendsRUN apt-get install -y tmux ros-melodic-dynamic-reconfigure libzstd-devRUN apt-get install -y \clang \cmake \g++ \git \google-mock \libboost-all-dev \libcairo2-dev \libcurl4-openssl-dev \libeigen3-dev \libgflags-dev \libgoogle-glog-dev \liblua5.2-dev \libsuitesparse-dev \lsb-release \ninja-build \stow
RUN apt-get install -y vim net-tools git sshRUN apt-get install -y python-sphinx
RUN apt-get install -y libceres-dev tarWORKDIR /home/xx/carto_libs
#git clone http://gitlab.csjbot.com/RenBot/abseil-cpp.git
#git clone http://gitlab.csjbot.com/RenBot/ceres-solver.git
#git clone http://gitlab.csjbot.com/RenBot/protobuf.git#ADD abseil-cpp.tar.gz /home/xx/carto_libs/abseil-cpp.tar.gz
#ADD ceres-solver.tar.gz /home/xx/carto_libs/ceres-solver.tar.gz
#ADD protobuf.tar.gz /home/xx/carto_libs/protobuf.tar.gzCOPY abseil-cpp.tar.gz /home/xx/carto_libs/
COPY ceres-solver.tar.gz /home/xx/carto_libs/
COPY protobuf.tar.gz /home/xx/carto_libs/WORKDIR /home/xx/carto_libs/
RUN tar -xzvf /home/xx/carto_libs/abseil-cpp.tar.gz abseil-cpp && \tar -xzvf /home/xx/carto_libs/ceres-solver.tar.gz && \tar -xzvf /home/xx/carto_libs/protobuf.tar.gzRUN echo "Start ceres"
WORKDIR /home/xx/carto_libs/ceres-solver
RUN cd /home/xx/carto_libs/abseil-cpp && \#git checkout tags/carto && \mkdir -p build && \cd build && \cmake .. -DCXX11=ON && \make -j16 && \make install >> ../install.info && \echo "Finish ceres"RUN echo "Start abseil"
WORKDIR /home/xx/carto_libs/abseil-cpp/
#RUN cd abseil-cpp
RUN cd /home/xx/carto_libs/abseil-cpp && \#git checkout tags/carto && \mkdir -p build && \cd build && \cmake -DCMAKE_BUILD_TYPE=Release -DCXX11=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_PREFIX=/usr/local/stow/absl .. && \make -j12 && \make install >> ../install.info
RUN cd /usr/local/stow && \stow --replace absl && \echo "Finish abseil"WORKDIR /home/xx/carto_libs
RUN echo "Start protobuf"
RUN cd /home/xx/carto_libs/protobuf && \#git checkout tags/carto && \mkdir -p build && \cd build && \cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release -Dprotobuf_BUILD_TESTS=OFF ../cmake && \make -j12 && \sudo make install >> ../install.info && \echo "Finish protobuf"RUN echo "export DISABLE_AUTO_TITLE=true" >> ~/.bashrc
RUN echo 'LC_NUMERIC="en_US.UTF-8"' >> ~/.bashrc
RUN echo "source /usr/share/gazebo/setup.sh" >> ~/.bashrc
RUN echo 'alias cinstall="catkin_make install -j12"' >> ~/.bashrc
RUN echo 'alias cbuild="catkin_make -j12"' >> ~/.bashrcRUN echo "bashrc"
RUN echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
RUN echo "source /opt/ros/melodic/setup.bash" >> /home/xx/.bashrc
RUN echo "source /home/xx/yy/install/setup.bash" >> /home/xx/.bashrc
RUN echo "source /home/xx/yy/install/setup.bash" >> ~/.bashrc
RUN pwd
WORKDIR $WSCMD ["bash","-c","/home/xx/yy/start.sh"]
相关文章:
x86架构利用docker去编译arm64的应用程序
文章目录1. 交叉编译:toolchain2. 隔离挂载的方式:3. QEMU 或其他模拟器来实际运行dockerx86架构实现多平台系统代码的编译,实现方式有多种:交叉编译:toolchain 【新的第三方库不好处理】隔离挂载的方式 【速度慢&…...
华为OD机试题 - 优秀学员统计(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为…...

Nginx学习(7)—— 过滤模块(filter)
文章目录过滤模块简介执行时间和内容执行顺序Nginx是怎么按照次序依次来执行各个过滤模块的呢这些过滤模块的简述(按执行顺序)模块编译过滤模块分析相关结构体响应头过滤函数响应体过滤函数主要功能介绍发出子请求优化措施过滤模块简介 执行时间和内容 …...
【创作赢红包】
1、IoC\nIoC(Inversion of Control,控制反转)是一种软件设计思想,它的核心思想是将对象之间的依赖关系交给容器来管理,从而降低对象之间的耦合度,提高代码的灵活性和可维护性。\n\n在传统的编程模式中&…...

Mybatis入门
1. 框架 框架相当于是一个脚手架,内部已经写好了很多代码,我们只要其基础上进行开发就可以提高我们的开发效率 框架阶段学习: ①先去学习如何使用框架 ②然后再使用熟练的情况下去猜测内部的原理 ③通过源码去验证自己的猜测。 2.Mybat…...

金色传说:SAP-PP-CO01/CO02 生产订单下达保存时报错:用户状态 新建 是活动的 (ORD %00000000001) 消息号BS014
文章目录问题描述一、原因分析:二、解决方案:总结问题描述 某一特殊订单类型的生产订单下达保存时,出现报错提示:用户状态 新建 是活动的 (ORD %00000000001) 报错的消息号为BS014 一、原因分析: 既然是某一特殊订单类型才出现报错,那么问…...

@Transactional和synchronized同时使用时的一些问题以及解决
Transactional和synchronized同时使用并不能保证事务一致性背景任何事情都有一个发生背景有个需求【一个业务里面包含多个事务,而且还需要避免其他线程的影响,所幸的是该服务只需要启动单实例,不然还要考虑分布式的影响】我的思路就是用Transactional 和 synchronized来保证事务…...
贪心-根据身高重建队列
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组 peopl…...

「解析」牛客网-华为机考企业真题 21-40
又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工…...
JAVA练习92-快乐数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 提示:这里可以添加本文要记录的大概内容: 3月28日练习内容 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目-…...

BPF 之路:技术背景
目录 引言 什么是BPF 历史 组成 执行机制 BPF 和ebpf 的关系 BCC、bpftrace、IO Visor BCC 项目的quick start execsnoop biolatency 动态插桩:kprobes和uprobes 概念 缺点 静态插桩:tracepoint 和USDT 概念 缺点 推荐的方案 初识bpft…...

C++—— set、map、multiset、multimap
目录 关联式容器 概念 键值对 树形关联式容器 set 介绍 定义方式 使用 map 介绍 使用 multiset 介绍 使用 multimap 介绍 使用 相关的OJ题 前K个高频单词 关联式容器 概念 我们之前接触过的一些容器,比如:vector、list、deque、forwa…...

Qlib使用
Qlib https://github.com/microsoft/qlib 将csv文件转化为Qlib的数据格式:https://qlib.readthedocs.io/en/latest/component/data.html#converting-csv-format-into-qlib-format 注意每支股票都要保存成单独一个文档,且文档名字与股票代号一致。 其中f…...

TL-WDR7660 httpProcDataSrv任意代码执行漏洞复现分析
01 漏洞简述 2023年1月31日,CNVD公开了一个由国内安全研究员提交的TL-WDR7660 httpProcDataSrv任意代码执行漏洞,编号为CNVD-2023-05404,同时公开了漏洞利用详情,poc代码链接为https://github.com/fishykz/TP-POC。从poc代码详情…...

基于DDS的SOA测试方案实现
随着以太网技术在车载网络中的应用,各种基于以太网的中间件也相继被应用在车内,如果对车载网络有过相关了解的小伙伴,对于作为中间件之一的DDS(数据分发服务Data Distribution Service)可能并不陌生;若没有…...

LibTorch中Windows系统环境配置及CUDA不可用问题解决
前言:本文对在Windows系统上进行LibTorch开发环境配置及相关问题解决做一个较为详细的记录,以便后续查询使用。 使用环境版本: Windows 11 Visual Studio 2022 CUDA 12.0 LibTorch 1.13.1_cu11.7 目录一、LibTorch简介二、LibTorch下载安装三…...

Java并发编程实战二
线程间的通讯方式 1.volitate(缓存一致性协议),synchronize,lock(都保证可见性) 2.wait.notify,await(),signal(前两个是Object,后两个属于lock) 3.管道输入、输出流 (示例代码:PipeInOut.java)(目前几乎没人使用) 管道输入/输…...

Linux中最基本的命令ls的用法有哪些?
Linux是一种流行的操作系统,被广泛应用于服务器和个人电脑。Linux命令行界面是使用Linux操作系统的关键。其中一个最基本的命令是"ls"命令,该命令用于列出指定目录中的所有文件和子目录。在这篇文章中,我们将探讨ls命令及其各种用途…...

第 100002(十万零二)个素数是多少?
题目描述 素数就是不能再进行等分的整数。比如7,11。而 9 不是素数,因为它可以平分为 3 等份。一般认为最小的素数是2,接着是 3,5,... 请问,第 100002(十万零二)个素数是多少? 请注意࿱…...
Lua迭代器
Lua迭代器 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。 在 Lua 中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。 泛型 f…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...