基于Docker搭建属于你的C&C++集成编译环境

常常,我会幻想着拥有一个随时可以携带、随时可以使用的开发环境,那该是多么美好的事情。

在工作中,编译环境的复杂性常常让我头疼不已。稍有不慎,删除了一些关键文件,整个编译链就会瞬间崩溃。更糟糕的是,当我花费大量时间和精力搭建好的环境,不得不在不同的机器上重复这份工作时,心中的焦虑更是无以言表。尤其是当代码需要交给同事处理,如果能将整个环境如同复制粘贴一般简单传递,那将是多么美妙的事。

当然,虚拟机的确可以实现这种“复制粘贴”的效果,但从版本管理、镜像托管和维护的角度来看,其成本却颇高。这样的方案,并不是我心目中理想的选择。于是,我将目光转向了Docker。

一、需求整理

我理想的C/C++编译环境,至少需要具备以下环境或工具:

  1. Conan​: 一个我常用且比较流行的的C/C++包管理工具
  2. CMake​: 最流行的C/C++构建系统
  3. 基础编译环境:gcc​,make​,gdb​等
  4. ARM编译工具链:gcc-arm-none-eabi​, gcc-arm-linux-gnueabihf​, gcc-aarch64-linux-gnu​等
  5. 基础开发库:比如libssl-dev​, libgl-dev​等,这些主要是方便其他上层库的编译

二、Docker简介

image

Docker 是一个容器引擎。对于没有接触过 Docker 的开发者来说可能比较陌生。可以将 Docker 大致理解为一个轻量级虚拟机框架,但实际上它比虚拟机更高效。Docker 具备以下几点特性:

  1. 足够快:Docker 容器启动速度非常快,通常只需要几秒钟。这是因为容器共享主机操作系统的内核,而不像虚拟机需要启动一个完整的操作系统。这种高效性使得开发和测试过程更加顺畅。
  2. 管理方便:Docker 提供了丰富的命令行工具和 API,使得容器的创建、启动、停止和销毁变得非常简单。同时,Docker Compose 允许开发者使用一个简单的 YAML 文件来定义和管理多容器应用,使得部署和管理复杂应用变得更加方便。
  3. 生态好:Docker 拥有庞大且活跃的社区,提供了丰富的镜像资源。通过 Docker Hub,开发者可以方便地下载和分享容器镜像。Docker 还支持与各种 CI/CD 工具、云平台和编排工具(如 Kubernetes)的集成,形成了一个完善的生态系统。
  4. 一致性:Docker 确保应用程序在开发、测试和生产环境中运行的一致性。这意味着开发者可以在本地开发和测试应用程序,然后将相同的容器部署到生产环境中,而不必担心环境差异带来的问题。
  5. 资源高效:与传统的虚拟机相比,Docker 容器更加轻量级,消耗的资源更少。容器共享主机操作系统的内核,避免了虚拟机需要为每个实例分配完整操作系统资源的情况。
  6. 安全隔离:Docker 使用内核命名空间(namespace)和控制组(cgroup)技术提供进程和资源的隔离。这种隔离确保了每个容器之间的安全性,避免了相互干扰。
  7. 可移植性:Docker 容器可以在任何支持 Docker 的系统上运行,无论是本地开发环境、云服务还是数据中心。这种可移植性使得应用程序能够在不同环境之间轻松迁移。

这些特性使得 Docker 成为现代软件开发和部署过程中不可或缺的工具,极大地提高了应用的可移植性和开发效率。在Docker中包含三个基本概念,分别是:

  • 镜像(Image) :Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container) :镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository) :仓库可看成一个代码控制中心,用来保存镜像。

Docker 的安装方法不在这里赘述。目前 Docker 发布了 Docker Desktop 软件,这款桌面软件允许用户通过 GUI 来管理 Docker 镜像和容器。对新手来说会比较友好,至于是使用命令行还是 GUI 方式,可根据个人喜好进行选择。

三、DockerFile

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
COPY ./sources.list /etc/apt/sources.list

# Install packages
RUN set -eux \
    && apt-get update \
    && apt-get -yq upgrade \
    && apt-get -yq install \
        aptitude apt-rdepends bash build-essential ccache clang clang-tidy cppcheck curl doxygen diffstat gawk gdb git gnupg gperf iputils-ping \
        linux-tools-generic nano nasm ninja-build openssh-server openssl pkg-config python3 python-is-python3 spawn-fcgi net-tools iproute2 \
        sudo tini unzip valgrind wget zip texinfo gcc-multilib chrpath socat cpio xz-utils debianutils \
        patch perl tar rsync bc xterm whois software-properties-common apt-transport-https ca-certificates\
        dh-autoreconf apt-transport-https g++ graphviz xdot mesa-utils \
    && exit 0

# Install cmake
RUN set -eux \
    && wget https://github.com/Kitware/CMake/releases/download/v3.28.5/cmake-3.28.5-linux-x86_64.sh -q -O /tmp/cmake-install.sh \
    && chmod u+x /tmp/cmake-install.sh \
    && mkdir /opt/cmake-3.28.5 \
    && /tmp/cmake-install.sh --skip-license --prefix=/opt/cmake-3.28.5 \
    && rm /tmp/cmake-install.sh \
    && ln -s /opt/cmake-3.28.5/bin/* /usr/local/bin \
    && cmake --version \
    && exit 0

# Install arm compiler
RUN set -eux \
    && apt-get update \
    && apt-get -yq install \
        gcc-arm-none-eabi \
        g++-arm-linux-gnueabi gcc-arm-linux-gnueabi \
        g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf \
        g++-aarch64-linux-gnu gcc-aarch64-linux-gnu \
    && exit 0

# Install python pip
RUN set -eux \
    && python3 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jelin大魔王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值