赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:本节讲解了为什么需要配置这样一套开发环境,可以跳过
本文力求通俗、详细的讲解 C程序开发 环境配置。深入浅出的讲解以及大量的图片对小白更友好。看完本文你将得到一套 vscode + gcc + gdb + CMake + clangd 的 c/c++ 开发环境(支持 嵌入式开发 )。
为什么需要一套这样的开发环境?
我们在 “宇宙级IDE” Visual Studio 中点点鼠标就能编译c代码,足够完成老师的作业。没错,这种简单好用,具有代码补全,可以一键编译、调试的开发软件就叫 集成开发环境 或 IDE。
很可惜,vscode并不是一个ide,它只是一个代码编辑工具,类似电脑里的记事本。为了实现代码补全、编译、调试的功能,我们需要在vscode里安装几个插件。
为什么不直接用ide呢?
当然可以,ide的简便能让新手更快入门编程。但是使用ide可能遇到以下几个困境:
vscode的安装非常简单,网上有许多教程,挑选一个近期的教程就行。这里给出一个教程:
【你要做的】
此时你已经能通过vscode编写代码,但仅仅只能编写、保存。想要运行代码看到效果,需要 编译器 将代码编译为 可执行文件
GCC 是 GNU 开发的C语言编译器,开发C语言必不可少的工具。而 windows 平台下的 GCC 叫 MinGW,因此我们需要安装这个叫 MinGW 的软件。
同样参考近期教程就行,这里给出推荐:
【安装步骤】
无论参考哪个教程,最后能通过以下测试就代表安装成功:
按 win + r 打开运行窗口,输入 cmd 回车进入命令行,输入 gcc -v
现在我们可以使用 vscdoe 编辑代码 , 在命令行使用 MinGW 编译代码了。
【编译步骤】
gcc -o main.exe main.c
,这个命令的意思是调用 gcc 编译器,将 main.c 编译成可执行文件 main.exe.\main.exe
运行程序,程序的输出会显示在这个终端里#include <stdio.h>
int main()
{
printf("hello world!\r\n");
return 0;
}
OK,到目前为止,我们已经可以编写代码、编译程序,能够完成简单的开发工作了。
gcc 编译的程序可以使用 gdb 调试 (如果你用 clang 编译程序则可以用 lldb 调试)
gcc 与 gdb 是一套的开发工具,在安装 MinGW 时我们已经同时获得了二者。
【调试步骤】
gcc -o main.exe main.c -g
重新生成 main.exe 。加上-g 参数让生成的程序可以调试。gdb main.exe
调用 gdb 进行调试lsit 1
查看当前“行号”前后10行的代码b 5
,在 第5行 设置一个断点r
全速运行程序,根据 gdb 的输出可以知道命中了刚才设置的断点,下一条要执行的语句是第5行n
执行下一条语句,观察 gdb 的输出,正常显示了 pritntf() 的内容以及下一条要执行的语句r
继续全速运行,提示程序执行完毕,是否要继续从头执行n
结束程序运行quit
退出 gdb 调试至此,你已经体验过了一次紧张刺激的 gdb 调试。
gdb 提供了调试程序的服务,vscode 里的 c/c++ 插件则可以为这个调试过程提供图形界面。
【安装步骤】
c/c++
点击第一个结果【配置launch.json步骤】
{
"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 构建工程吧!
每次编译要写一长串gcc命令非常麻烦,而且随着工程变大,使用gcc命令非常复杂且容易出错。更简单的方法是使用 Makefile 。
Makefile 文件里有我们提前精心设计好的编译命令,之后 make 工具会去读取 Makefile 并一条条执行里面的指令。代替我们手敲指令。
这个 make 工具也在 MinGW 里提供了,不需要另外安装。
【Makefile使用步骤】
mingw32-make.exe
(linux执行 make
),这个 make 程序会在当前命令行路径下找到 Makefile 文件,执行Makefile里预设好的命令。这里运行了 第2行 的命令 “gcc -o main main.c”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 , 而不是编译所有文件。这会大大缩短编译时间。mingw32-make.exe clean
命令,自动执行 Makefile 里的 第5行 指令 “rm main.exe”main.exe : main.c
gcc -o main main.c
clean:
rm main.exe
Makefile 很强大,但也有些问题。为庞大的工程编写 Makefile 比较麻烦。且不同平台(如win和Linux)的编译指令不一样,如果你发布的代码想要运行在不同平台,必然要为不同平台各自写一份 Makefile 。
这时候你就需要 CMake了,CMake 使用一个 CMakeLists.txt 文件记录工程结构(比如有哪些.c文件,头文件路径在哪之类的),之后能为每个平台生成各自的 Makefile 。也就是说我们只需要关注代码怎么写,具体如何用命令行来编译交给 Cmake 就行。很多开源项目都在使用CMake构建工程。下面介绍 Vscode 平台下 CMake 的安装与使用。
【你要做的】
CMake
和 CMake Tools
,安装这两个插件。安装完毕可能需要重启 vscodeCMakeLists.txt
文件 (最好注意大小写),这个文件是给 CMake 用的,每个使用 CMake 构建的工程都有这个文件mkdir .\build\
,在该目录下创建一个 build 文件夹cd .\build\
,进入刚刚创建的 build 文件夹cmake .. -G "MinGW Makefiles"
,这个命令是使用 CMake 插件来生成 Makefilemingw32-make.exe
,步骤7 生成了 Makefile ,接下来当然就是执行 make 编生成 main.exe 文件./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)
CMake 插件还提供了更简单的操作方法,让你点点鼠标就能完成工程构建,参考这个教程:
目前为止我们实现了代码的编辑、编译、调试、用 CMake 构建工程。遇到新工程只需要重复 步骤3-9 就行。具体 CMakeLists.txt 文件的编写方法属于 CMake 语法,本文不重点介绍。
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 读取这个文件,从而提供代码补全、跳转定义等语法服务。
【你要做的】
"C_Cpp.intelliSenseEngine": "disabled"
目前我们已经完全实现了目标,相信你已经能独立开发 Linux 内核了。
原创文章不易,请动动你的小拇指,点个免费的赞吧,阿里嘎多!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。