实现在CLion中用Docker进行ARM程序的交叉编译

背景与目标

项目采用CMake,开发工具采用CLion,因为要编译在ARM与Window上运行的程序(ARM上是为最终运行环境,WINDOW上则用用于方便开发模拟与测试),因此为了统一开发环境,采用CLion+CMake+Docket+MinGw的方案。其中Window环境下用MinGW工具链,ARM上则用gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu工具链。本文重点介绍CLion下用Docker来实现对ARM程序的交叉编译实现(原想用window环境下的ARM交叉编译工具来实现,但由于涉及太多的依赖库需要重构就放弃了)。

基本思路

在Docker中构建一个基于Ubuntu18.04的Linux系统,并将ARM交叉编译工具链安装到该Docker环境,同时将所有程序依赖库(ARM指令集的库)也需放入到系统内,从而实现在该环境中可交叉编译出ARM上的程序。然后,通过配置CLion中配置该Docker,实现在CLion环境中进行编译调试。

用于交叉编译的Docker环境构建与CLion配置

1. 在Window下安装Docker Desktop软件,Docker安装好后最好配置一下国内镜像源,以加快镜像下载速度。

2. 下载ubuntu官方的镜像。

docker pull ubuntu:18.04

3. 运行ubuntu:18.04镜像容器,并进入该容器,首先安装基础的软件与 GCC for x86(因为这个官方的18.04比较干净,后面根据需要还要编译相关库,因此需要安装)。

apt install sudo apt install build-essential pkg-config ca-certificates openssl libssl libssl-dev libssl1.0.0 unzip vim

4. 下载交叉编译工具链,由于我用的是7.5.0版的,因此从`https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/`下载,需要下载的有:

   1. gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz  //GCC与G++等

   2. sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu.tar.xz //工具链依赖的基础库

   3. runtime-gcc-linaro-7.5.0-2019.12-aarch64-linux-gnu.tar.xz //运行时依赖的其础库(可用于运行环境)

5. 在Docker中创建一个卷来保存工具链,这里用单独卷的目的是方便在不同的unbutnu版中的共用,另外不采用挂载宿主目录方案是因为我是Window系统,挂载的目录中不支持软链接,因此基于以上原因采用Docker卷的方案。创建一个卷取名为`VolumeToolchain`。

6. 启动容器。

docker run -it --name armcompiler -v VolumeToolchain:/sysroot -v D:\toolchain\docker-volume:/mnt/host ubuntu:18.04 /bin/bash

7. 启动后,/mnt/host被映射到宿主目录,用于向容器传送文件用。容器/sysroot目录映射到VolumeToolchain卷,用于保存工具链与依据库等文件。

8. 将下载的`gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz`与`sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu.tar.xz`解压到/sysroot中,同时将程序依赖库也可以复制到该目录中,由此我的/sysroot目录结构如下:

   1. /sysroot/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu  //交叉编译工具链

   2. /sysroot/sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu  //交叉编译工具链库

   3. /sysroot/lib          //依赖库,我是从ARM目标系统中的/lib中复制出来的

   4. /sysroot/usr/lib      //依赖库,我是从ARM目标系统中的/usr/lib中复制出来的

   5. /sysroot/include      //依赖库,我是从ARM目标系统中的/usr/include中复制出来的

   6. 最后要用Docker commit 容器ID armcompiler 进行新建一个新的Docker Image,名称为armcompiler。

9. 经实验aarch64-gcc在链接工具链依赖库时会固定在系统中的/lib/aarch64-linux-gnu与/usr/lib/aarch64-linux-gnu中搜索库文件(即使用了sysroot选项),因此需要在linux系统中的/lib与/usr/lib建立软链接,如下

   1. ln -s /sysroot/sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu/lib  /lib/aarch64-linux-gnu

   2. ln -s /sysroot/sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu/usr/lib  /usr/lib/aarch64-linux-gnu

10. 进行CMakeLists.txt的编写,主要是以下配置

    1.  set(CMAKE_SYSROOT ${SYSROOT}/sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu)  其中SYSROOT=/sysroot

    2.  link_directories(${SYSROOT}/usr/lib ${SYSROOT}/lib/ ${SYSROOT}/usr/lib/aarch64-linux-gnu ${SYSROOT}/lib/aarch64-linux-gnu) 其中SYSROOT=/sysroot

11. 进行Clion的配置

    1.  File-Settings-ToolChains 新建一个Docker项

    2.  Server项为 Docker

    3.  Image项为 armcompiler

    4.  Container Settings 项为 --entrypoint -v rk3399-libraries:/sysroot:ro --rm  (注意:不要使用--name项)

    5.  CMake项为 /usr/bin/cmake

    6.  Build Tool项为 /usr/bin/make

    7.  C Compiler项为 /opt/aarch64-toolchain/bin/aarch64-linux-gnu-gcc

    8.  C Compiler项为 /opt/aarch64-toolchain/bin/aarch64-linux-gnu-g++

    9.  Debugger项为 /opt/aarch64-toolchain/bin/aarch64-linux-gnu-gdb

12. 即可通过Docker来进行ARM程序的交叉编译

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值