基于 Docker 搭建交叉编译环境

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

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

sh 复制代码
# 获取 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 如下

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

执行:

sh 复制代码
# -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"
相关推荐
科技象限4 分钟前
数据防泄漏系统:文件是怎么溜出门的,就该怎么堵
运维·网络·网络安全·安企神
cpolar技术支持18 分钟前
端口被谁占了、这台机上开了哪些监听?本机起一个端口占用只读清单,cpolar 给异地同事远程看谁在监听
运维·python·内网穿透·cpolar·端口占用
JavaPub-rodert20 分钟前
Docker 容器为什么 stop 半天停不下来?讲透 PID 1、SIGTERM、SIGKILL、僵尸进程与 tini
运维·docker·容器
学IT的周星星1 小时前
记忆系统:让 Agent 记住你是谁、上次聊到哪
运维·服务器·人工智能·windows·大模型·llm·agent
en.en..1 小时前
MRS/MSR 指令操作 xPSR 寄存器
linux·运维·服务器
Brilliantwxx2 小时前
【Linux】 自主shell编写巩固复习篇
linux·运维·服务器·开发语言
Qt云程序员2 小时前
零代码网页数据采集教程:不写爬虫,把网页数据搬进 Excel
运维·自动化
Android系统攻城狮3 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_parse_caps调用流程与实战(八十)
linux·运维·服务器·gstreamer音视频·音视频进阶
Lsetea3 小时前
OpenSSL指定-cipher仍协商TLS1.3:证书排查中的套件与协议边界
运维·https·ssl证书·openssl·tls
先知后行。3 小时前
进程间通信(IPC)
linux·运维·服务器