基于 Docker 搭建交叉编译环境

本文主要介绍如何使用 Docker 搭建交叉编译环境

关于 docker 交叉编译环境,已经有人做成项目开源了。我们只需使用即可

# 获取 linux-arm64 镜像
docker pull dockcross/linux-arm64# 该镜像不能直接运行, 需要间接运行,我是真的服了
# 根据提示, 将运行报错导出成一个脚本,使用该脚本来运行docker run --rm dockcross/linux-arm64 > dockcross-linux-arm64
chmod +x dockcross-linux-arm64# 导出的脚本是 bash 这意味着 windows 直接不能用了啊, 可能默认觉得 Windows 用户一定使用 WSL 吧
# 不过我是在 Windows 的 MSYS2 下, 有 bash 环境,但还是报错, 后排查是路径名问题
# 因此更改生成的 dockcross-linux-arm64 脚本
HOST_PWD=$(echo $HOST_PWD | sed 's/\//\\\//g')# 最后通过这个脚本执行 bash, 这个执行一次就退出
# 注意: -c 是 bash 的参数, 不是 ./dockcross-linux-arm64
./dockcross-linux-arm64 bash -c 'echo Hello World'# 可直接处理本地文件, 例如编译本机的 hello.c
# 其原理也很简单, 就是 docker 启动时通过 -v 当前路径到容器里面即可
./dockcross-linux-arm64 bash -c '$CC hello.c -o hello'

搞了半天发现不支持直接安装 arm64 的包, 麻烦的地方不在于交叉编译一个简单的hllo world 而是编译需要依赖各种 qt, opencv, ssl 等库,手动编译这些库比较麻烦。

而这个 docker 环境也只是简单地安装了一下交叉编译器,既然如此那我为何不直接使用 vm 虚拟机或 WSL 里交叉编译。

基于 Debain 构建

既然 dockcross 不好用, 那就自己创建一个 docker 镜像好了

参考 i96751414/cross-compiler-linux-arm64, 发现这个也是基于 Debain 容器镜像

Dockerfile 如下

from debian# 添加 arm64 仓库
RUN dpkg --add-architecture arm64
RUN apt-get update# 本机工具
RUN apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu make git file -y# arm64 端库
RUN apt install qtbase5-dev:arm64 apt install libqt5svg5-dev:arm64 -y# 替换 qmake
RUN rm /usr/bin/qmake
RUN ln -s /usr/lib/aarch64-linux-gnu/qt5/bin/qmake /usr/bin/qmake

执行:

# -t,--tag: 指定镜像名称
docker build -t aarch64 .# 构建镜像完成后查看所有镜像, 找到刚才创建的 ID 3d0ee59732ed
docker images# 运行镜像, 并挂载自己的工程路径到 docker 容器中, -i,--interactive 保持打开, -t,--tty 分配一个伪终端
docker run -v /c/Users/shino/Desktop/qdraw:/mnt -it aarch64 bash# 可在里面进行 qmake && make 操作, 当然一切顺利后续可以直接执行如下命令。(--rm: 运行后立即删除容器)
docker run -v /c/Users/shino/Desktop/qdraw:/mnt --rm -it aarch64 bash -c "cd /mnt && qmake && make -j8"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过Vue自定义指令实现前端埋点

在营销活动中,通过埋点可以获取用户的喜好及交互习惯,从而优化流程,进一步提升用户体验,提高转化率。 在之前的埋点方案实现中,都是在具体的按钮或者图片被点击或者被曝光时主动通过事件去上报埋点。这种方法在项目中…

K8Spod组件

一个pod能包含几个容器 一个pause容器(基础容器/父容器/根容器) 一个或者多个应用容器(业务容器) 通常一个Pod最好只包含一个应用容器,一个应用容器最好也只运行一个业务进程。 同一个Pod里的容器都是运行在同一个node节点上的,并且共享 net、…

javaweb学习笔记

JSP 动态网页,指的是随时间、地点、用户操作改变的网页 架构 CS架构 client-server 缺点:每一台客户端都需要安装客户端软件,如果升级全要升级,如果坏了就得维护 优点:响应快,界面美观 BS架构 browser-…

Zookeeper集群 + Kafka集群的详解与部署(以及Filebeat+Kafka+ELK )

zookeeperkafka.txt Zookeeper概述 Zookeeper是一个分布式的开源协调服务,用于管理和维护大型分布式系统中的配置信息、命名服务、状态同步等。它提供了一个可靠的分布式环境,用于协调多个节点之间的通信和管理。 数据结构 ZooKeeper数据模型的结构与…

以STM32为例,实现按键的短按和长按

以STM32为例,实现按键的短按和长按 目录 以STM32为例,实现按键的短按和长按1 实现原理2 实现代码3 测试结束语 1 实现原理 简单来说就是通过设置一个定时器来定时扫描几个按键的状态,并分别记录按键按下的持续时间,通过时间的长短…

序列化与反序列化xml bin

1、XML XML(可扩展标记语言)序列化是一种将对象的数据结构转换为XML格式的过程,以便将其存储在文件中、通过网络传输或与其他系统进行数据交换。在C#中,你可以使用.NET框架提供的XmlSerializer类来执行对象到XML的序列化和XML到对…

Java中访问未初始化的对象:原理、错误与防范

在Java编程中,访问未初始化的对象是一种常见的错误,可能导致程序运行时异常。这个问题的根本原因在于Java要求对象在使用之前必须经过初始化,否则会存在未知的状态。本文将详细讲解Java中访问未初始化对象的原理、可能导致的错误以及如何防范…

后端杂七杂八系列篇一

后端杂七杂八系列篇一 ① MySQL选择合适的数据类型① Char与Varchar② Text与Blob ② EqualsAndHashCode(callSuper true)的作用③ mybatis-plus 相关① 主键生成策略② 使用Model实现CRUD③ Wrapper的用法① Wrapper的继承关系② 项目中最常用的warpper [LambdaQueryWrapper]…

[NISACTF 2022]level-up

[NISACTF 2022]level-up wp level 1 robots.txt 通过目录爆破,发现存在 robots.txt 文件(或者说查看源码,源码中有 disallow 提示,说明存在 robots.txt 文件): dirsearch -u "http://node5.anna.n…

M3u8播放列表文件(索引格式文件)、HLS(HTTP Live Streaming)协议介绍

M3U8文件格式是为了支持HLS(HTTP Live Streaming)协议而开发的。HLS是Apple公司设计的一种基于HTTP的流媒体传输协议,用于传输音频和视频数据。 在HLS中,媒体内容被切分为一系列的小片段,每个片段都有自己的URL。这些U…

Docker入门教程(详解)

Docker容器化 一 入门 1. 引言 (1)单机部署 场景: 将多个应用部署一台服务器上。 问题 每个应用软件,都会消耗物理资源,共用计算机资源,彼此之间会形成竞争关系。 (2)多机部署 …

python django 生鲜商城管理系统

python django 生鲜商城管理系统,包含用户端和管理端 功能: 用户端:商城主页展示,登录,注册,用户中心,购物车,我的订单,购物车结算 管理端:登录,商品&…

Java 堆与栈的作用与区别

栈是运行时的单位,而堆是存储的单位,栈解决程序的运行问题,堆解决数据存储的问题。 一个线程对应一个线程栈,栈是运行单位,里面存储的信息都是跟当前线程相关的信息,包括局部变量、程序运行状态、方法返回…

SpringBoot: 通过MyBatis访问ClickHouse

一、ClickHouse中建表&#xff0c;添加数据 二、SpringBoot项目添加mybatis、clickhouse、druid相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version></dependency>…

SQL学习汇总

数据库将两张没有关联的表进行横向连接数据库将两张表进行横向连接&#xff08;拼接成一张表的形式显示&#xff09;_db2 两条记录如果相同就横向显示-CSDN博客 mysql统计某个字段的比例_mysql查询一行某个字段占整个字段sum的比例-CSDN博客 Spark 系列&#xff08;十二&…

opencv入门到精通——Canny边缘检测

目录 理论 OpenCV中的Canny Edge检测 附加资源 在本章中&#xff0c;我们将学习 Canny边缘检测的概念 OpenCV函数: cv.Canny() 理论 Canny Edge Detection是一种流行的边缘检测算法。它由John F. Canny发明 1.这是一个多阶段算法&#xff0c;我们将经历每个阶段。 2.降…

原生JS调用OpenAI GPT接口并实现ChatGPT逐字输出效果

效果&#xff1a; 猜你感兴趣&#xff1a;springbootvue实现ChatGPT逐字输出打字效果 附源码&#xff0c;也是小弟原创&#xff0c;感谢支持&#xff01; 没废话&#xff0c;上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><me…

09、docker 安装nacos并配置mysql存储配置信息

docker 安装nacos并配置mysql存储配置信息 1、docker启动nacos的各种方式2、Docker安装nacos3、MySQL中新建nacos的数据库4、挂载数据or配置目录5、运行 1、docker启动nacos的各种方式 内嵌derby数据源 docker run -d \ -e PREFER_HOST_MODEhostname \ -e SPRING_DATASOURCE_…

软件测试技术复习点

1 术语含义&#xff08;故障、错误、失效、测试用例&#xff09; 故障&#xff08;Fault&#xff09;&#xff1a;故障是软件中的静态缺陷&#xff1b; 故障屏蔽&#xff1a;软件中的某个故障可能被其他一个或多个故障屏蔽&#xff1b; 错误&#xff08;Error&#xff09;&…

1 电科院FTU检测标准学习笔记-外观检查

作者简介&#xff1a; 本人从事电力系统多年&#xff0c;岗位包含研发&#xff0c;测试&#xff0c;工程等&#xff0c;具有丰富的经验 在配电自动化验收测试以及电科院测试中&#xff0c;本人全程参与&#xff0c;积累了不少现场的经验 目录 **前言****检测大纲****外观与结构…