背景
最近换上了mbp作为开发工具,在mbp上默认的c++环境是clang+LLVM那一套工具链,虽然说是相比gnu更加先进,但是因为我的代码经常需要在linux服务器和本机上跑,而clang和gnu的编译器在编译器参数,api支持等方面还是存在一定差异,最简单的libc++和libstdc++的标准库的不同就能浪费大量的时间在上面做兼容。我想了如下几个方案,并最终采用了docker的方案。
- 把整个mac的编译环境改成gnu那一套,问题:可能导致mac上一些需要编译的工具出现潜在问题
- 写代码的时候就考虑clang和gnu环境的兼容性,问题:对不同标准库的api不够熟悉,了解的性价比不高
- 抛弃本地环境,完全在服务器开发,问题:受到网络环境的影响大,调试不够方便
- 起一个linux的本地docker作为开发环境(完美)
确定使用docker环境开发后,第二个问题是用什么工具开发,如果你只使用vscode,那么你可以先跳过docker镜像制作的部分,vscode已经提供了c++镜像,只需要安装remote插件,就可以达到几乎开箱即用的效果。但是你如果像我一样调试的时候还是喜欢clion的强大功能,那么你可以先从docker镜像制作看起。
docker镜像制作
在我的docker环境中,我采用了比较新自己也比较熟悉的ubuntu作为基础环境,增加了一些常用工具和方便的连接docker所需要的一些工具。完整的docker环境可以在我的github查看docker-cpp-dev-environment
step0: 在mac上安装docker,直接在官网下载一个dmg,安装好,就能在顶栏看到一个小鲸鱼的标志,运行命令行,docker image ls
不会报错,说明安装成功
step1: 首先是dockerfile的编写:
# 基础镜像
FROM ubuntu:20.04
# 作者信息版本信息
LABEL version="v2" \
maintainer="Sunchao <hustcaid@gmail.com>"
# 可用命令行参数配置的boost版本信息
ARG BOOST_VERSION=1.73.0
ARG BOOST_VERSION_=1_73_0
ENV BOOST_VERSION=${BOOST_VERSION}
ENV BOOST_VERSION_=${BOOST_VERSION_}
ENV BOOST_ROOT=/usr/include/boost
# tzdata直接安装时可能需要手动选择时区,添加该环境变量让其不要通过交互,自动选择
ENV DEBIAN_FRONTEND=noninteractive
# apt换源,加快构建速度
COPY sources.list /etc/apt/sources.list
RUN apt-get update
# 安装openssh 和 rsync是用于clion的远程部署和连接docker开发
RUN apt install -y --no-install-recommends tzdata build-essential cmake gdb openssh-server rsync vim git wget
# 配置 sshd和rsnyc, 允许root登陆 关闭usePAM 允许rsnc
RUN mkdir /var/run/sshd
RUN sed -ri 's/^#PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config && sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config && sed -ri 's/RSYNC_ENABLE=false/RSYNC_ENABLE=true/g' /etc/default/rsync
# config rsync service
COPY rsync.conf /etc
# 设置root的密码
RUN echo 'root:000000' |chpasswd
RUN mkdir /root/sync
# install boost
RUN wget --max-redirect 3 --no-check-certificate https://dl.bintray.com/boostorg/release/${BOOST_VERSION}/source/boost_${BOOST_VERSION_}.tar.gz
RUN mkdir -p /usr/i