提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 1. Vscode
  • 2. GCC编译器
    • 2.1 前提知识
    • 2.2 安装与使用
  • 3. GDB
    • 3.1 前提知识
    • 3.2 安装与使用
    • 3.3 图形界面调试
  • 4. CMake
    • 4.1 前提知识
    • 4.2 安装与使用
    • 4.3 图形界面CMake
  • 5. Clangd
    • 5.1 前提知识
    • 5.2 安装与使用

前言

提示:本节讲解了为什么需要配置这样一套开发环境,可以跳过

本文力求通俗、详细的讲解 C程序开发 环境配置。深入浅出的讲解以及大量的图片对小白更友好。看完本文你将得到一套 vscode + gcc + gdb + CMake + clangdc/c++ 开发环境(支持 嵌入式开发 )。

为什么需要一套这样的开发环境?
我们在 “宇宙级IDE” Visual Studio 中点点鼠标就能编译c代码,足够完成老师的作业。没错,这种简单好用,具有代码补全,可以一键编译、调试的开发软件就叫 集成开发环境IDE

很可惜,vscode并不是一个ide,它只是一个代码编辑工具,类似电脑里的记事本。为了实现代码补全、编译、调试的功能,我们需要在vscode里安装几个插件。

为什么不直接用ide呢?
当然可以,ide的简便能让新手更快入门编程。但是使用ide可能遇到以下几个困境:

  1. github上下载的源码只有一堆.c/.h文件,不是vs工程,如何在源码上进行构建开发?
  2. 发布开源工程,要告诉别人怎么使用我的库好麻烦,如果编译等过程可以用命令行写成脚本,整个过程自动完成就好了。
  3. 公司的项目使用CMake进行组织,只能适应项目。
  4. 面试的时候不会CMake、gcc、gdb,还没进公司就结束嘞。

1. Vscode

vscode的安装非常简单,网上有许多教程,挑选一个近期的教程就行。这里给出一个教程:

链接: VSCode安装配置使用教程(最新版超详细保姆级含插件)一文就够了

【你要做的】

  1. 安装vscode
  2. (可选)安装chinese插件,重启 vscode 获得中文界面。英文界面好处是报错的时候显示英文,更方便查询错误代码。


此时你已经能通过vscode编写代码,但仅仅只能编写、保存。想要运行代码看到效果,需要 编译器 将代码编译为 可执行文件


2. GCC编译器

2.1 前提知识

GCC 是 GNU 开发的C语言编译器,开发C语言必不可少的工具。而 windows 平台下的 GCC 叫 MinGW,因此我们需要安装这个叫 MinGW 的软件。

2.2 安装与使用

同样参考近期教程就行,这里给出推荐:

链接: 下载安装MinGW-w64详细步骤

【安装步骤】

  1. 进入官网下载MinGW
  2. 安装(解压)
  3. 添加路径到环境变量

无论参考哪个教程,最后能通过以下测试就代表安装成功
按 win + r 打开运行窗口,输入 cmd 回车进入命令行,输入 gcc -v


现在我们可以使用 vscdoe 编辑代码 , 在命令行使用 MinGW 编译代码了。

【编译步骤】

  1. 在 vscode 中点击 菜单栏-终端-新建终端,在底部得到一个命令行窗口,这个终端等同于刚才的黑框命令行
  2. 在左侧栏空白处右键 – 新建文件 输入文件名 main.c
  3. 输入文件内容 (可以在下面复制)
  4. 输入命令 gcc -o main.exe main.c ,这个命令的意思是调用 gcc 编译器,将 main.c 编译成可执行文件 main.exe
    (不熟悉 gcc 命令也没关系,照做就行,先搭建环境再学习 gcc 的使用)
  5. 可以观察到在 main.c 的同级目录里,已经产生了一个 main.exe 文件
  6. 输入命令 .\main.exe 运行程序,程序的输出会显示在这个终端里
  7. 得到程序的输出,程序正常运行
#include int main(){printf("hello world!\r\n");return 0;}

OK,到目前为止,我们已经可以编写代码、编译程序,能够完成简单的开发工作了。


3. GDB

3.1 前提知识

gcc 编译的程序可以使用 gdb 调试 (如果你用 clang 编译程序则可以用 lldb 调试)

3.2 安装与使用

gcc 与 gdb 是一套的开发工具,在安装 MinGW 时我们已经同时获得了二者。

【调试步骤】

  1. 删除之前生成的 main.exe ,输入命令 gcc -o main.exe main.c -g 重新生成 main.exe 。加上-g 参数让生成的程序可以调试。
  2. 输入命令 gdb main.exe 调用 gdb 进行调试
  3. 根据提示信息,输入 c 并回车继续调试
  4. 输入 lsit 1 查看当前“行号”前后10行的代码
  5. 输入 b 5 ,在 第5行 设置一个断点
  6. 输入 r 全速运行程序,根据 gdb 的输出可以知道命中了刚才设置的断点,下一条要执行的语句是第5行
  7. 输入 n 执行下一条语句,观察 gdb 的输出,正常显示了 pritntf() 的内容以及下一条要执行的语句
  8. 输入 r 继续全速运行,提示程序执行完毕,是否要继续从头执行
  9. 输入 n 结束程序运行
  10. 输入 quit 退出 gdb 调试

至此,你已经体验过了一次紧张刺激的 gdb 调试。


3.3 图形界面调试

gdb 提供了调试程序的服务,vscode 里的 c/c++ 插件则可以为这个调试过程提供图形界面。

【安装步骤】

  1. 在 vscode 左侧栏中点击 拓展 按钮,打开插件市场
  2. 搜索 c/c++ 点击第一个结果
  3. 点击 安装 ,可以从插件的介绍看出,该插件提供 调试(debugging)、语法补全等服务(code browsing)

【配置launch.json步骤】

  1. 点击左侧栏中的 调试 按钮
  2. 点击 “创建launch.json文件”
  3. 选择目录,不一定出现这个步骤,这是选择创建 launch.json 文件的目录
  4. 选择带 gdb 字样的选项,这是选择调试器,我们用 gcc 编译的程序,自然用 gdb 调试程序
  5. 步骤4-7 最终目的是在 main.c 所在目录生成一个 .vscode 文件夹 里面有 launch.json 文件。这个文件会告诉 c/c++ 插件,要去哪里找到 gdb 程序、要用 gdb 去调试哪个 .exe 文件。现在我们来填写 launch.json 文件。
    (步骤4-7也可以不做,我们自己手动创建 .vscode 文件夹 以及 launch.json 文件,效果一样,反正文件内容接下来也要全部重写)
  6. 重写 launch.json 文件 (可以在下面复制)
    “name”, “type”, “request” 是必须有的, “type”: “cppdbg” 代表使用 c/c++ 插件进行调试
    “program” 最重要,表示需要调试程序的路径,即 main.exe 的路径,“cwd” 用于查找依赖项和其他文件的当前工作目录
    “MIMode”, “miDebuggerPath” 提供了gdb的路径 (这个路径要根据你自己安装 MinGW 的路径填写)
    (这里只列出一份非常简单的 launch.json ,更详细的写法推荐查看 vscode 官方的文档)

链接: 在Visual Studio Code中调试

  1. 点击 “调试” 按钮
  2. 打一个断点
  3. 点击按钮开始调试,这个按钮的名称对应 launch.json 中的 “name”
  4. 在上方的调试栏有全速运行、单步运行等,还可以将变量添加到监视区查看值,之后的调试技巧可以查找 “ vscode 调试教程 ” 了解
{"version": "0.2.0","configurations": [{"name": "C++ Launch","type": "cppdbg","request": "launch","program": "${workspaceFolder}/main.exe","cwd": "${workspaceFolder}","MIMode": "gdb","miDebuggerPath": "D:\\MinGw64\\bin\\gdb.exe"// 注意修改成你自己安装MinGWd的路径}]}




OK,到目前为止,我们已经可以编写代码、编译程序、调试程序了,接下来尝试用 CMake 构建工程吧!


4. CMake

4.1 前提知识

每次编译要写一长串gcc命令非常麻烦,而且随着工程变大,使用gcc命令非常复杂且容易出错。更简单的方法是使用 Makefile

Makefile 文件里有我们提前精心设计好的编译命令,之后 make 工具会去读取 Makefile 并一条条执行里面的指令。代替我们手敲指令。

这个 make 工具也在 MinGW 里提供了,不需要另外安装。


【Makefile使用步骤】

  1. 新建Makefile文件,输入图中的内容(可以在下面复制),主要内容是 第2行 和 第5行 的两个命令
  2. 在命令行执行 mingw32-make.exe (linux执行 make),这个 make 程序会在当前命令行路径下找到 Makefile 文件,执行Makefile里预设好的命令。这里运行了 第2行 的命令 “gcc -o main main.c”
  3. 自动执行 gcc -o main main.c 指令,生成了main.exe
  4. 再次执行 mingw32-make.exe,提示说 mingw32-make: ‘main.exe’ is up to date. 意思是已经生成了 main.exe 且 main.c 也没修改过,就不再重新生成 main.exe 了。这个功能的意义在于:假设你有 1.c 2.c 3.c 三个文件,你只修改了 3.c 之后进行编译,由于 1.c 2.c 没有修改则不会参与编译,仅重新编译 3.c , 而不是编译所有文件。这会大大缩短编译时间。
  5. 执行mingw32-make.exe clean命令,自动执行 Makefile 里的 第5行 指令 “rm main.exe”
  6. 自动执行 rm main.exe 清除了main.exe
main.exe : main.cgcc -o main main.cclean:rm main.exe

Makefile 很强大,但也有些问题。为庞大的工程编写 Makefile 比较麻烦。且不同平台(如win和Linux)的编译指令不一样,如果你发布的代码想要运行在不同平台,必然要为不同平台各自写一份 Makefile 。

这时候你就需要 CMake了,CMake 使用一个 CMakeLists.txt 文件记录工程结构(比如有哪些.c文件,头文件路径在哪之类的),之后能为每个平台生成各自的 Makefile 。也就是说我们只需要关注代码怎么写,具体如何用命令行来编译交给 Cmake 就行。很多开源项目都在使用CMake构建工程。下面介绍 Vscode 平台下 CMake 的安装与使用。

4.2 安装与使用

【你要做的】

  1. 点击vscode左侧的“拓展按钮”
  2. 在搜索栏查找 CMakeCMake Tools ,安装这两个插件。安装完毕可能需要重启 vscode
  3. 新建 CMakeLists.txt 文件 (最好注意大小写),这个文件是给 CMake 用的,每个使用 CMake 构建的工程都有这个文件
  4. 输入图中内容 (可以在下面复制) ,重点是 第8行 ,表示使用 main.c 生成 main.exe
  5. 在源码目录下执行 mkdir .\build\,在该目录下创建一个 build 文件夹
  6. 执行 cd .\build\ ,进入刚刚创建的 build 文件夹
  7. 执行 cmake .. -G "MinGW Makefiles" ,这个命令是使用 CMake 插件来生成 Makefile
    a . . 表示在 build 的上一层目录 (即源码 main.c 所在目录) 寻找 CMakeLists.txt
    b -G “MinGW Makefiles” 是因为 CMake 默认使用微软的 MSVC 作为编译器,想使用 MinGW 编译器可以通过 -G 参数来进行指定,只有第一次构建项目时需要指定。
    c 步骤 5-7 称为使用 CMake 进行 外部构建 ,执行完后在 build 文件夹中生成了Makefile 。你还可以发现一个 compile_commands.json 文件,这是神奇妙妙文件,作用之后再说。
  8. 执行mingw32-make.exe,步骤7 生成了 Makefile ,接下来当然就是执行 make 编生成 main.exe 文件
  9. 执行./main.exe 运行程序,程序正常执行输出 hello world!
cmake_minimum_required(VERSION 3.0)set(CMAKE_EXPORT_COMPILE_COMMANDS True)# 让CMake生成compile_commands.json文件set(CMAKE_BUILD_TYPE "Debug")# 设置编译时使用 -g 参数生成可供调试的程序,不设置则生成的main.exe无法调试project(HELLOWORLD)add_executable(main main.c)

4.3 图形界面CMake

CMake 插件还提供了更简单的操作方法,让你点点鼠标就能完成工程构建,参考这个教程:

链接: VSCode与CMake搭配使用之基本配置

目前为止我们实现了代码的编辑、编译、调试、用 CMake 构建工程。遇到新工程只需要重复 步骤3-9 就行。具体 CMakeLists.txt 文件的编写方法属于 CMake 语法,本文不重点介绍。


5. Clangd

5.1 前提知识

clangd 是做什么用的?
clangd 是语言服务器,提供代码补全、语法高亮、代码格式化、跳转到定义等非常实用的功能。在阅读源码时如果不能直接跳转到定义将会寸步难行。所以为了愉快的开发C程序,clangd 几乎是必不可少的。
(虽然之前安装的 C/C++ 插件也有语言服务功能,但我们将关闭它的语言功能,仅使用调试功能)

为什么不用微软提供的 C/C++ 插件?

根据笔者的经验,目前想要在 vscode 上开发嵌入式代码,提供语法服务,clangd 是唯一的选择。

为什么 clangd 可以在嵌入式开发中使用?
window 平台下 使用 printf() 函数时,编译器 MinGW 会在它的库文件里找到函数实现并调用。同样,用户在 Linux 平台下调用函数时,交叉编译工具链也会去内核源码中找到函数实现并调用。但是 windows 平台下没法运行 Linux 的交叉编译工具,在看到 printf() 时不知道去哪找这个函数的实现。
但是在编译程序时,代码里每个函数的具体实现在哪个 .c 文件是确定的,这是在 Makefile 里写好了的。跟踪 Makefile 的编译过程可以知道各个函数的调用关系。在 4.2 步骤7 中生成的 compile_commands.json 就是保存了各个函数调用关系的文件。Clangd 读取这个文件,从而提供代码补全、跳转定义等语法服务。

5.2 安装与使用



【你要做的】

  1. 查找并安装 clangd 插件
  2. a 安装完 clangd 后,右下角出现弹窗,意思是 clangd 和 c\c++ 的语法服务功能重复了,我们 选择禁用 c\c++
    (如果 2.a 没有弹出弹窗,需要执行 2.b – 2.e ,否则不用执行)
    b 如果没有在弹窗中禁用 c\c++ ,那么点击齿轮按钮
    c 点击设置,打开设置页
    d 点击右上角按钮,打开 setting.json 文件,修改文件内容就是在修改 vscode 的设置
    e 在 setting.json 的图示位置追加一行代码 (下文给出) ,意思是告诉 vscode 不要使用 c\c++ 的语法服务功能
  3. 同 4.2 的 步骤3-4 ,新建CMakeLists.txt文件,输入内容。其中 第3行 的含义是设置生成 compile_commands.json
  4. 同 4.2 的 步骤5-7 ,运行CMake,生成 compile_commands.json
  5. 检查一下 build 文件夹下确实有我们需要的文件
  6. 随便点开一个 .c 文件,这会触发 clangd 开始工作
    a clangd 会解析 compile_commands.json ,生成一个.cache 文件夹,里面是 clangd 建立的索引
    b clangd 表示已经建立索引完毕 (idle) ,可以正常使用语言服务了,在大型工程里需要等待一段时间建立索引
    c 已经可以使用语法补全功能了
"C_Cpp.intelliSenseEngine": "disabled"

目前我们已经完全实现了目标,相信你已经能独立开发 Linux 内核了。


原创文章不易,请动动你的小拇指,点个免费的赞吧,阿里嘎多!