《软件工具》手把手教你使用Visual Studio Code开发C/C++(Linux)

Posted Bruceoxl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《软件工具》手把手教你使用Visual Studio Code开发C/C++(Linux)相关的知识,希望对你有一定的参考价值。

C/C++的开发工具很多,微软的Visual Studio,QT等都是不错的选择,但是这些IDE都过于庞大,而且有很多IDE都是收费的。笔者这里推荐GCC+Make+代码编辑器的方式来开发C?C++,该方式不仅适用于PC端,还适用于嵌入式。

接下来说说需要那些软件吧。

(1) VSCode:超好用的编辑器,支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、Git 等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化。软件跨平台支持 Win、Mac 以及 Linux,运行流畅,可谓是微软的良心之作,也是本文要重点介绍的。

(2) GCC:GCC是GNU操作系统的官方编译器。已经被大多数类Unix操作系统采纳为标准的编译器。GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。另一方面,说到 GCC 对于操作系统平台及硬件平台支持,概括起来就是一句话:无所不在。

(3) make:make工具用以简化编译过程,当编译一个包括成百上千个文件的大型项目时,逐个文件编译繁琐且低效,并且当更新某个文件之后,还需要重新再编译一次。makefile文件正是为解决此类问题而诞生的。现在绝大多数IDE,包括Window下的VS等IDE均使用makefile文件,只不过由系统自动生成,编程人员感觉不到而已。make工具的使用关键在于编写makefile文件。

以上软件都是开源免费的,随便你玩!

1 Visual Studio Code安装

1.根据使用的操作系统,直接从 Visual Studio Code 官网下载安装最新版。

下载地址

安装很简单,将code_1.59.1-1629375198_amd64.deb拷贝到Ubuntu中。

$ sudo dpkg -i code_1.59.1-1629375198_amd64.deb

安装完成后,在文件夹/usr/share/applications有Visual Studio Code快捷方式文件,可将其拖到侧边栏,就可以在快捷方式中打开软件。

打开界面如下:

2.打开 VS Code,点击 “Extensions” 图标,搜索 C/C++ 插件(由 Microsoft 提供),点击安装。

3.安装中文插件。

重启应用,Visual Studio Code就是中文界面了。
如果有需要可以安装VS Code自带的编译器。


2编译工具安装

前面安装的Visual Studio Code只能说是一个代码编辑器,而编译代码需要编译器,Linux系统的编译器是GCC。安装命令如下:

$ sudo apt-get install gcc

然后在命令窗口中输入下面的命令验证安装是否成功:

$ gcc -v 

对于单个文件, 使用GCC编译就行,但是对于大型的工程,就需要写Makefile来管理工程,这就需要一个工具来识别Makefile文件,也就是make工具。

在安装make工具之前,先来看看什么是makefile?Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。

在Linux安装make很简单,使用apt-get即可。

$ sudo apt-get install make

安装完成后,可查看make的版本信息。


3使用Visual Studio Code开发C/C++

3.1创建新的工程项目

选择一个文件夹,空白的即可。然后在VS Code中选择该文件夹即可。

最后创建的工程如下:

3.2配置工程

接下来就是配置工程。

配置c_cpp_properties.json

c_cpp_properties的作用是配置代码的智能语法辅助功能。

打开c_cpp_properties.json配置文件,输入以下内容:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "/usr/include",
                "${workspaceFolder}"
            ],
            "defines": [
                
            ],
            "compilerPath": "/usr/bin/gcc",
            "intelliSenseMode": "gcc-x64",
            "browse": {
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": "",
                "path": [
                    "${workspaceFolder}"
                ]
            }
        }
    ],
    "version": 4
}

name:这是用于标记使用的平台的标签。除了Linux还可以选Win32或Mac。也就是说,这个json里“configuration“下可以写三组配置,只要每组配置前面写上不同的平台,即可在不同的操作系统上使用就会自动适配不同的配置。

includePath:头文件路径。第一个目录是C语言标准库的目录, 剩下的几个目录直接从Makefile里复制然后稍微修改下即可。"${workspaceFolder}"表示项目文件夹;

defines:全局宏定义,这里的宏定义只写在源码中。VS Code只是一个编辑器,它检查代码的时候并不会去读makefile,因此有些宏定义需要自行配置。

compilerPath:编译器的路径。

intelliSenseMode:因为我用的是gcc所以选gcc-x64。

browse:源文件搜索路径。用来做代码补全和查找定义的。这个路径和includePath不同,browse.path是自动递归所有子目录的。而include.path默认只看本目录。

c_cpp_properties配置说明

配置tasks.json

tasks.json文件的作用是配置编译任务,如果没有则需要创建tasks.json文件,内容如下:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "build",
            "command": "gcc",
            "args": [
              "-g",
              "${file}",
              "-o",
              "${fileDirname}/{fileBasenameNoExtension}"
            ],
            "problemMatcher": "$gcc",
            "options": {
              "cwd": "${workspaceFolder}"
            },
            "group": {
              "kind": "build",
              "isDefault": true
            }
        }
    ]
}

type: 任务类型。任务执行的是shell命令。
label: 任务名。launch.json调用就是使用这个名字,注意是大小写区分的。
command: 任务的执行命令,这是执行的是gcc。
args: 任务的参数。也就是执行命令所带的参数。也就是上述命令gcc所带的参数。
problemMatcher: 错误捕获,这里使用gcc捕获错误。

Tasks配置说明

配置launch.json

在vscode文件夹中新建一个launch.json,该文件是调试的入口文件。内容如下:

{
    "version": "0.2.0",
    "configurations": [
        {
          "name": "gcc.exe - Build and debug active file",
          "type": "cppdbg",
          "request": "launch",
          "program": "${fileDirname}/${fileBasenameNoExtension}",
          "args": [],
          "stopAtEntry": false,
          "cwd": "${workspaceFolder}",
          "environment": [],
          "externalConsole": false,
          "MIMode": "gdb",
          "miDebuggerPath": "gdb",
          "setupCommands": [
            {
              "description": "为 gdb 启用整齐打印",
              "text": "-enable-pretty-printing",
              "ignoreFailures": true
            }
          ],
          "preLaunchTask": "build"
        }
      ]
}  

name:调试的名称。
type:调试类型,除使用msvc进行调试外,均为该类型
request:可以选launch或attach。launch是指启动调试时同时开始执行程序;attcah是指程序已经在运行了,然后开始调试。
program: 指定C/C++程序位置。
cwd: 指定工作目录。
preLaunchTask:在启动调试前,预先执行的任务。

launch.json参考

3.3调试

直接按F5,进入调试界面。调试界面如下:

界面左边可以看到变量窗口、调用堆栈等。窗口中间就是单步调试的各个按钮。这个就没啥好说的了,赶紧去玩起来吧。

除了使用Visual Studio Code自带的调试工具外,还可以使用MinGW的GDB调试,GDB也属于GNU项目的一部分,跟在Linux上调试是一样的。

GDB常用命令如表所示。

首先使用gcc编译代码,需要加‘-g’参数,这里和在Linux中调试是一样的。

在 gdb 中键入"l"(list)就可以查看所载入的文件,如下所示。

关于GDB的使用请看笔者文章:
GDB调试

3.4多文件编译与调试

前文的工程都是单文件的,在实际工程中,都是会有很多文件,甚至有很多文件夹。

笔者这里新建main.c、fun.c和fun.h文件。文件内容分别如下。
【main.c】

/**
  ******************************************************************************
  * @file                main.c
  * @author              BruceOu
  * @version             V1.0
  * @date                2021-09-06
  * @blog                https://blog.bruceou.cn/
  * @Official Accounts   嵌入式实验楼
  * @brief               
  ******************************************************************************
  */
/**Include*********************************************************************/
#include "fun.h"

/**
  * @brief  main
  * @param  None
  * @retval int
  */
int main()
{
    int num = 100;

    fun_print_int(num);

    return 0;
}

【fun.c】

/**
  ******************************************************************************
  * @file                fun.c
  * @author              BruceOu
  * @version             V1.0
  * @date                2021-09-06
  * @blog                https://blog.bruceou.cn/
  * @Official Accounts   嵌入式实验楼
  * @brief               fun
  ******************************************************************************
  */
/**Include**********************************************************************/
#include "fun.h"

/**
  * @brief  print number
  * @param  num
  * @retval None
  */
void fun_print_int(int num)
{
    printf("fun print int: %d\\n", num);
}

【fun.h】

#ifndef _FUN_H_
#define _FUN_H_

#include "stdio.h"

void fun_print_int(int num);

#endif

如果遇到多个文件,这就需要将main.c中包含的xxx.h文件和xxx.c源文件包含到GCC的编译参数中,也就是tasks.json文件。
【tasks.json】

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "build",
            "command": "gcc",
            "args": [
              "-g",
              "${file}",
              "${fileDirname}/fun.c",
              "-o",
              "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "problemMatcher": "$gcc",
            "options": {
              "cwd": "${workspaceFolder}"
            },
            "group": {
              "kind": "build",
              "isDefault": true
            }
        }
    ]
}

可以看到,相比当个文件,多个文件的配置也就是在args参数中添加相关的依赖文件。

接下来调试下。

从调试结果来看,这是完全没有问题的。

但是如果有很多文件,换个其他环境,这种方式显然是不具有通用性的,这里就需要使用Makefile来管理工程文件。

【Makefile】

##编译工具
CC = gcc

##Windows平台删除需要用del
win = 

TARGET = main
SOURCE = *.c

#
CPPFLAGS = -I.
CFLAGS = -g -Wall -o2

obj:
    $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TARGET) $(SOURCE)

## clean
clean:
ifdef win
    del $(TARGET).exe
else
    rm  $(TARGET)
endif

.PHONY: clean

值得注意的是,在makefile中,命令行要以tab键开头,在windows下和linux下,可能由于编辑器不同,这里需要注意下,不然可能会报‘missing separator. Stop’的错误。

要想使用Visual Studio Code调试,还需要修改tasks.json文件。
【tasks.json】

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "build",
            "command": "make",
            "args": [
              "-j4"
            ],
            "dependsOn":"clean"
        },
        {
          "type": "shell",
          "label": "clean",
          "command": "make",
          "args": [
            "clean"
          ]
      }
    ]
}

tasks.json新建了两个任务,一个是make任务,一个是clean任务,make任务依赖clean,在每次调试前需要清理前一次编译的结果。

同样能调试。

当然啦,还可以使用GDB调试。

当然啦,这里也可以使用cmake来管理工程,有兴趣的可以去研究。




欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎


欢迎订阅我的微信公众号

以上是关于《软件工具》手把手教你使用Visual Studio Code开发C/C++(Linux)的主要内容,如果未能解决你的问题,请参考以下文章

软件测试 | 手把手教你如何使用 ABD调试工具,学不会算我的!

苏州程序大白手把手教你Visual Studio 远程调试

visual studio除了6还有哪个版本用得多而又不占内存?如何实现多visual studi

HarmonyOS - 手把手教你搭建Artifactory

研发课堂丨手把手教你添加i.MX6UL对curl软件的支持

研发课堂丨手把手教你添加i.MX6UL对curl软件的支持