有一个使用了 Epoll 的 C 项目,笔者平时用的 Linux 主力开发机不在身边,想在 macOS 上开发调试,但是没有 Linux 虚拟机。恰好,JetBrains CLion 的 Toolchains 配置除了使用本地环境,还支持 SSH、Docker。
笔者使用 CLion + Docker Desktop,不到十分钟就能在 macOS 上搭建一个能够开发使用 Linux 类库的 C 项目的开发环境,而且具备不错的开发体验。
文章目录
- 准备 Docker 环境
- 构建一个包含项目所需依赖的 Image
- 准备 Dockerfile 并安装所需依赖
- 构建 Image
- CLion 配置 Toolchains
- Toolchains 添加 Docker 环境
- CMake 项目选择刚才添加的 Docker Toolchain
- 开发体验
- 头文件导航
- 直接运行
- 调试运行
- 【更新】CLion Debug 控制台没有日志
准备 Docker 环境
macOS 使用 Docker Desktop 即可,本文不赘述。
当然,Docker 环境也可以不在本地,可以通过 TCP 或者 SSH 连接非本地 Docker 环境。
构建一个包含项目所需依赖的 Image
准备 Dockerfile 并安装所需依赖
笔者的主力开发机是 Ubuntu 22.04,选择相同的系统作为基础镜像。
镜像构建按照项目所需依赖即可。以下是搭建一个最基本的 C/C++ 环境的 Dockerfile。
FROM ubuntu:22.04
MAINTAINER wuweijie@apache.org
RUN apt update && apt install -y cmake g++ gdb
提示:如果所在环境无法加速访问 Ubuntu 官方 apt 源,建议使用国内 apt 源。
将 sources.list 覆盖基础镜像中原有的 sources.list。
FROM ubuntu:22.04
MAINTAINER wuweijie@apache.org
ARG TARGETARCH
COPY $TARGETARCH/sources.list /etc/apt/sources.list
RUN apt update && apt install -y cmake g++ gdb
构建 x86/64 架构的环境可以使用以下 sources.list
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
构建 aarch64 及其他架构的环境可以使用以下 sources.list
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse
构建 Image
>>> docker build -t teslacn/cmake:1.0 .
[+] Building 16.4s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 37B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:22.04 16.3s
=> [1/3] FROM docker.io/library/ubuntu:22.04@sha256:f154feaf13b51d16e 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 65B 0.0s
=> CACHED [2/3] COPY arm64/sources.list /etc/apt/sources.list 0.0s
=> CACHED [3/3] RUN apt update && apt install -y cmake g++ gdb 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:b4ad8d6c3284e79dedcf8c628b1a89c0bb59d29000 0.0s
=> => naming to docker.io/teslacn/cmake:1.0 0.0s
CLion 配置 Toolchains
Toolchains 添加 Docker 环境
选择构建好的镜像即可,CLion 会自动检测构建工具、编译器、GDB 版本。
CMake 项目选择刚才添加的 Docker Toolchain
开发体验
头文件导航
CLion 自动将容器中的 Linux 头文件缓存在了本地,从代码中能够直接导航到 sys/epoll.h
文件,使用起来和直接在 Linux 环境开发没有区别。
直接运行
与平时本地运行相比完全没有差异。
调试运行
调试运行发现,除了程序的日志没有打出到 stdout 以外,其他调试功能和本地调试完全没有差异。
以上即环境搭建的过程与结果。
【更新】CLion Debug 控制台没有日志
解决方法:
setbuf(stdout, 0);
https://stackoverflow.com/questions/47776094/clion-wont-show-output-in-debug