zoukankan      html  css  js  c++  java
  • Linux下 VS Code 安装与 C 编程环境配置!

            对于多文件的C项目,大部分人会选择使用'cmake'来管理编译过程,对于精力充沛的朋友来说,也可以学习一下使用这个强大的工具。

            但我觉得如果只想在VS Code里写几行代码应对当前需求,没必要再去学习一个完全陌生的东西,也没必要把配置过程复杂化。

            所以我接下来讲的配置多文件编译的过程并不涉及'cmake'。

     

    目录模式

            我将这种配置方式称为“目录模式”,跟Eclipse类似,每个目录作为一个项目。


     

            在上一篇中我们讲了如何进行单文件的编译和调试,其中使用了VS Code提供的变量,以定位到当前文件。

            同样地,我们只需要再使用VS Code提供的变量,定位到当前目录,再利用Linux Shell的通配符,即可匹配到当前目录下所有要编译的源文件。

            gcc本身是支持多文件编译的,只需要把文件名作为参数即可。

            配置好的tasks.json文件大致如下:

    {
    
        "version": "2.0.0",
    
        "tasks": [
    
            {
    
                "type": "shell",
    
                "label": "build(gcc)",
    
                "command": "gcc",
    
                "args": [
    
                    "-g",
    
                    "-o",
    
                    "/tmp/buildtempc",
    
                    "*.c"                  // 匹配所有源文件
    
                ],
    
                "options": {
    
                    "cwd": "${fileDirname}" // 定位到当前目录
    
                },
    
                "group": {
    
                    "kind": "build",
    
                    "isDefault": true
    
                }
    
            }
    
        ]
    
    }

     

            配置好的launch.json文件大致如下:

    {
    
        "version": "0.2.0",
    
        "configurations": [
    
            {
    
                "name": "debug(gdb)",
    
                "type": "cppdbg",
    
                "request": "launch",
    
                "program": "/tmp/buildtempc",
    
                "args": [],
    
                "stopAtEntry": false,
    
                "cwd": "${fileDirname}",    // 定位到当前目录
    
                "environment": [],
    
                "externalConsole": false,
    
                "MIMode": "gdb",
    
                "setupCommands": [
    
                    {
    
                        "description": "Enable pretty-printing for gdb",
    
                        "text": "-enable-pretty-printing",
    
                        "ignoreFailures": true
    
                    }
    
                ],
    
                "preLaunchTask": "build(gcc)",
    
            }
    
        ]
    
    }

     

            注意:匹配源文件时一定要写成'*.c',而不能写成'*'。因为头文件不是编译单元,头文件在编译源文件时被处理。

            在我的配置文件里,我将可执行文件放在了'/tmp'目录下,以使工作目录看起来简洁一些。

            '.vscode'目录下的配置文件对工作空间下的所有目录和文件都是有效的,现在我们只需要新建一个目录,并在里面写好头文件和源文件,就可以编译和调试了。


     

    目录模式有一些缺陷:

            ✿ 头文件和源文件放在一起会比较乱

            ✿ 项目变多的时候,工作空间会比较乱

            ✿ ‘C/C++’扩展会扫描工作空间内的所有文件,如果项目变多会降低扩展性能,也会使扩展功能混乱

     

    授之以鱼不如授之以渔。

    我强烈建议不要直接复制我的配置文件,而是要理解每个配置选项的意义和目的,从而写出符合个人喜好的配置。

     

    项目模式

            对于目录模式来说,如果工作空间的项目变多,就会出现麻烦。所以在项目模式里,每个项目独占一个工作空间,类似VS的解决方案。

            因为一个项目独占一个工作空间,所以我们没必要把所有文件都挤在一起,还可以再细分。比如我喜欢分为“头文件”、“源文件”、“资源文件”。

            “资源文件”目录用于调试程序的相对位置读写,或者存放一些与编译无关的其他文件。每一个类别建立一个目录。


     

            'C/C++'扩展会扫描工作空间下的所有文件,所以在写#include时不需要指定文件夹,代码提示也能正常工作。

            但是gcc在编译时只会查找源文件所在目录下的头文件,所以需要额外参数指定头文件目录。

            另外,也需要指定需要编译的源文件目录。

            而资源文件与编译过程无关,需要修改调试的配置文件。

            配置好的tasks.json文件大致如下:

    {
    
        "version": "2.0.0",
    
        "tasks": [
    
            {
    
                "type": "shell",
    
                "label": "build(gcc)",
    
                "command": "gcc",
    
                "args": [
    
                    "-g",
    
                    "-o",
    
                    "/tmp/buildtempc",
    
                    "-iquote",                  // 指定头文件目录
    
                    "Headers",                  // 头文件目录
    
                    "Sources/*.c"              // 源文件目录下的所有源文件
    
                ],
    
                "options": {
    
                    "cwd": "${workspaceFolder}" // 定位到工作空间
    
                },
    
                "group": {
    
                    "kind": "build",
    
                    "isDefault": true
    
                }
    
            }
    
        ]
    
    }

     

            配置好的launch.json文件大致如下:

    {
    
        "version": "0.2.0",
    
        "configurations": [
    
            {
    
                "name": "debug(gdb)",
    
                "type": "cppdbg",
    
                "request": "launch",
    
                "program": "/tmp/buildtempc",
    
                "args": [],
    
                "stopAtEntry": false,
    
                "cwd": "${workspaceFolder}/Resources",  // 定位到资源文件目录
    
                "environment": [],
    
                "externalConsole": false,
    
                "MIMode": "gdb",
    
                "setupCommands": [
    
                    {
    
                        "description": "Enable pretty-printing for gdb",
    
                        "text": "-enable-pretty-printing",
    
                        "ignoreFailures": true
    
                    }
    
                ],
    
                "preLaunchTask": "build(gcc)",
    
            }
    
        ]
    
    }

     

            这样,就可以跟VS一样在项目中写代码了。


     

            当然,这种配置方法的缺点也显而易见。新建一个项目的成本太大了,每新建一个项目就得再写一次配置文件,并新建三个目录。

            不过,在Linux下,这些重复的工作当然是交给计算机来做。我们只需要保存一份'.vscode'模板就好,比如我保存在变量CODE_PATH表示的目录下。每个项目的配置文件都是一样的,直接拷贝就好。

            Bash脚本如下: 

    #!/bin/bash
    
    # Filename: project-c
    
    # Create a C project, and open it in vscode.
    
    echo -n "project name: "
    
    read name
    
    name=$(date +%Y%m%d)-"$name"        // 生成项目名
    
    mkdir "$CODE_PATH"/"$name"          // 新建项目目录
    
    cd "$CODE_PATH"/"$name"
    
    cp -r "$CODE_PATH"/.vscode .        // 拷贝配置文件
    
    mkdir Headers Sources Resources    // 新建分类目录
    
    code .                              // 使用VS Code打开项目
    
    cd - &> /dev/null

     

            在脚本中,我给项目名称加上了时间戳,方便查找与避免重名。启动VS Code的命令是code。


     

    不管你是转行也好,初学也罢,进阶也可

    ——【值得关注】我的C/C++编程学习进阶俱乐部 ——

    涉及到:C语言、C++、windows编程、网络编程、QT界面开发、Linux编程、游戏编程、黑客等等......

  • 相关阅读:
    Unit app.service is not loaded properly: Exec format error
    No journal files were found.
    下一代存储技术的先行: NVDIMM 你了解吗?
    How To Share Data Between the Docker Container and the Host
    perl: warning: Please check that your locale settings:
    淘宝推荐、视频搜索背后的检索技术竟是它!深度揭秘达摩院向量检索引擎Proxima
    这可能是大型复杂项目下数据流的最佳实践
    MaxCompute在电商场景中如何进行漏斗模型分析
    技术干货 | 阿里云数据库PostgreSQL 13大版本揭秘
    ACK正式支持对基于Alibaba Cloud Linux操作系统的集群进行等保加固
  • 原文地址:https://www.cnblogs.com/huya-edu/p/14056310.html
Copyright © 2011-2022 走看看