Linux C++ 开发环境:Windows + VSCode + Docker

1,353 阅读3分钟

1. 安装docker

Docker官网 内存8G,16G

1.1 docker启动报错和解决方案:

a. 更新linux内核包,Windows Subsystem for Linux

image.png

解决方案: 下载 Linux 内核更新包

image.png

**b.打开VT虚拟化

控制面板 -> 程序和功能 -> 启用或关闭Windows功能 -> 勾选‘Hyper-V’、‘Windows虚拟机监控程序平台’、‘适用于Linux的Windows子系统’、‘虚拟机平台’ -> <确定>

cmd终端执行命令:bcdedit /set hypervisorlaunchtype auto

c.设置docker镜像仓库

"registry-mirrors":"https://hub-mirrors.c.163.com","https://mirror.baidubce.com","https://9cpn8tt6.mirror.aliyuncs.com"]

d.解决WSL2中Vmmem内存占用过大问题

### 修改当前用户下的文件,如果没有创建一个
%UserProfile%/.wslconfig 

### .wslconfig 文件内容
[wsl2]
memory=2GB
swap=0
localhostForwarding=true

### 以管理员的权限在 cmd 中执行如下命令
wsl一shutdown bash

1.2 查看 docker 信息

### docker 信息
docker info

### docker 版本
docker version

### 搜索 ubuntu 系统镜像
docker search ubuntu:20.04

### 拉取 ubuntu 镜像
docker pull xxx

1.3 创建并启动 docker 实例

docker run -it -v /D/share/flies:/dockerFshare/flies:/dockerFolder -d -p 220:220 --name=docker_ubuntu 镜像Id

为宿主机与docker实例创建共享文件夹:/D/share/flies 为宿主主机;/dockerFolder 为docker实例中的文件夹

Ubuntu 系统配置

  • 添加 su 用户
    ## 添加新用户,执行如下命令,输入密码 (该命令创建的用户具有 sudo 权限)
    adduser newUser su newUser
    
    ## 为非 su 用户设置 sudo 权限 
    vim /etc/sudoers
    
    ### 找到 root ALL=(ALL) ALL,在下一行添加新用户,如下命令
    newuser ALL=(ALL) ALL
    
  • 安装开发工具
## 更新 apt-get
sudo apt-get update

## 安装 GCC
sudo apt-get install build-essential

## Git 安装
sudo apt-get install git 

## GDB 调试器
sudo apt-get install gdb

  • 更换 apt 源

修改 sources.list 配置文件;

sudo vim /etc/apt/sources.list

在文件最前面添加以下条目(不同的Ubuntu版本对应的源地址不同,根据版本设置相应的源),保险起见,操作之前做好备份:sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak

阿里云源:ubuntu 20.04 Ubuntu 镜像

deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

# deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

参考:Linux系统各发行版换国内yum或apt源,加速软件下载更新

1.4 进入容器实例

## 替换 userName 和 实例Id
docker exec -it -u userName 实例Id  /bin/bash

1.5 备份容器实例

### container_id: 需要备份的容器实例Id
### imagename: 镜像名称
### v1.0: tag(版本号)
docker commit container_id imagename:v1.0

2. VSCode 配置

2.1 安装 C/C++ 插件

image.png

2.2 安装 Remote-Containers

image.png

2.3 连接 docker container

image.png

3. Ubuntu20 搭建 gRPC 源码环境

3.1 安装环境依赖


sudo apt-get install pkg-config ###(安装如果慢,请换ubuntu源)
sudo apt-get install autoconf automake libtool make g++ unzip
sudo apt-get install libgflags-dev libgtest-dev
sudo apt-get install clang libc++-dev
sudo apt-get install golang
sudo apt-get install openssl libssl-dev
sudo apt-get install zlib1g zlib1g-dev
sudo apt-get install libc-ares-dev libc-ares2
sudo apt-get install cmake

3.2 下载 gRPC 源码和依赖

git clone https://gitee.com/githubplus/grpc.git 
cd grpc 
git tag
git checkout v1.20.x
## 修改.gitmodules,将<github.com>替换为<gitee.com/githubplus>
## 下载依赖的模块
git submodule sync
git submodule update --init

3.3 编译 protobuf

cd third party/protobuf/
## 修改.gitmodules <github.com>
git submodule update --init --recursive ## 确保克隆子模块,更新第三方源码
## 生成配置脚本
sudo ./autogen.sh 

## 生成 Makefile 文件
sudo ./configure 

sudo make 
sudo make install 

## 更新共享库缓存
## 有报错的话尝试修改:/etc/sudo.conf -->> Set disable_coredump false
sudo ldconfig

## 查看软件的安装位置
which protoc

## 检查是否安装成功
protoc --version

3.4 编译 gRpc

回到gRpc源码根目录编译。首先查看下gcc版本号,若 gcc > 9.0+,编译之前需修改如下文件:

src/core/lib/gpr/log_linux.cc 
src/core/lib/gpr/log_posix.cc
src/core/lib/iomgr/ev_epollex_linux.cc 

### 将这几个文件中的 gettid()改为 sys_gettid()

image.png

修改 third_party/boringssl/crypto/x509/x509_test.cc TestTest1,只修改类(struct), 其它不变。

image.png

然后执行如下命令:

### 生成 makefile
cmake -DgRPC_INSTALL=ON -DgRPC_ZLIB_PROVIDER=package -DgRPC_CARES_PROVIDER=package -DgRPC_PROTOBUF_PROVIDER=package -DgRPC_SSL_PROVIDER=package

## 编译
sudo make
sudo make install

之后就可以进入 examples/cpp 编译运行示例了。