赞
踩
项目采用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环境中进行编译调试。
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程序的交叉编译
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。