VSCODE gcc运行多个.c文件

一、简介

        很多时候,开发者需要使用VSCODE进行C语言算法验证。而VSCODE的gcc编译,默认是只编译本文件的内容其他.c文件是不参与编译的。这就给开发者带来很大的困扰,因为开发者不可能把所有的算法都写在一个.c文件,特别是还需要调用一些其他库的时候。

        所以,这里就来分享一下,使用VSCODE编译多个.c文件的方法。

二、实操

        先看如下代码:

void main(void) 
{
    printf("Hello from main.c\n");
}

        使用VSCODE运行后,可以正常输出。

        然后,创建如下文件结构

        实现如下代码:

        可以看到,我们是希望在main函数中,调用hello.c里面的hello函数,从而打印数据。代码结构很简单,那编译一下看看结果。

        直接报错,提示 未定义hello函数(undefined reference to `hello')。

        奇怪了,明明已经包含了hello的头文件,并且在头文件里面也已经声明了hello函数,为什么会未定义呢?

        这是因为vscode的gcc默认只编译本文件下的main函数。并不会链接其他文件

        那如果我们希望链接其他文件,需要如何操作呢?

        

如果只关注结果,只配置settings.json文件即可。

        配置完settings.json文件后,可以正常编译执行。

tasks.json

         在vscode下按Ctrl+Shift+P或者F1来打开命令面板。

        输入 “Tasks:configure Task”,

         选择“c/c++:gcc.exe生成活动文件

         此时在工程目录下会生成.vscode文件,并且里面会有tasks.json文件

        这里简单介绍一下tasks.json文件。

        tasks.json文件是vscode的编译构建任务配置文件。在该文件中,可以定义多个任务,每个任务都包含了一些属性,例如任务名称、任务类型、执行命令等等。这些任务还可以指定执行依赖关系。通过配置tasks.json文件,可以方便地在vscode中执行这些任务,提高开发效率

属性介绍

type

        任务类型,有3个可选值,shell(执行shell)process(运行进程)cppbuild(C++程序编译构建)。其中前2个事VSCODE安装后即可提供的。cppbuild是安装C++扩展之后支持的。

label

        字符串类型,任务名,必选项。

command

        任务需要执行的具体命令,可以是外部程序shell命令。如对于C++编译任务,就可能是gcc

args

        命令执行的参数

        ${workspaceFolder}:工作区文件夹的绝对路径,就是通过vscode’打开的项目文件夹的绝对路径名

        ${workspaceFolderBasename}:工作区文件夹的基本名称,是去掉上层文件路径只保留项目文件夹名

        ${file}:在vscode中当前打开正在显示或编辑的文件的绝对路径文件名

        ${relativeFile}:当前打开文件相对于工作区文件夹的相对路径名

        ${fileBasename}:当前打开文件的基本名称,不含路径名,但包含文件扩展名,在文件就存放在工作文件夹下时,与${relativeFile}内容一致,如果存放在打开文件夹下的子文件夹时,则二者不一致

        ${fileBasenameNoExtension}:当前打开文件的基本名称,不包括扩展名

        ${fileDirname}:当前打开文件所在的目录路径

        ${fileExtname}:当前打开文件的扩展名

        ${cwd}:启动 VS Code 的工作目录

        -ogcc参数, 用于指定输出文件的名称。如果不使用此参数,编译器默认生成可执行文件a.out。

        -ggcc参数,在可执行文件中加入源代码的信息,以便于调试。这并不意味着整个源文件被嵌入到可执行文件中,而是包含调试信息。

        -cgcc参数,只生成目标文件(.o文件),而不连接成为可执行文件。这个参数通常用于编译不包含主程序的子程序文件。

        -Igcc参数指定头文件的文件夹

        更多gcc参数,可以参考如下链接:20个最常用的GCC编译器参数 · 分布式服务器开发 · 看云

options

        可选项。cwd,设置编译过程的路径

problematcher

        用于控制任务执行时问题匹配及输出

group

        用于定义任务属于哪个组,有3个可选项,build、test、none。一般只会用到build

detail

        备注

settings.json

        该文件用于定义VSCODE的行为和外观

        在vscode下按Ctrl+Shift+P或者F1来打开命令面板,并输入“open user tasks” 

         选择“打开用户任务”,会在当前文件夹的.vscode文件中,生成settings.json文件。但是文件为空

        添加如下代码:

{
    "editor.fontSize": 17,
    "workbench.iconTheme": "vscode-icons",
    "workbench.colorTheme": "Noctis Viola",
    "editor.minimap.enabled": true,
    "C_Cpp.autocomplete": "Default",
    "[cpp]": {
        "editor.quickSuggestions": true
    },
    "[c]": {
        "editor.quickSuggestions": true
    },
    "files.autoSave": "afterDelay",
    "code-runner.executorMap": {
        "javascript": "node",
        "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
        "cpp": "cd $dir && g++ *.cpp -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "c": "cd $dir && gcc *.c -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "php": "php",
        "python": "python -u",
        "perl": "perl",
        "perl6": "perl6",
        "ruby": "ruby",
        "go": "go run",
        "lua": "lua",
        "groovy": "groovy",
        "powershell": "powershell -ExecutionPolicy ByPass -File",
        "bat": "cmd /c",
        "shellscript": "bash",
        "fsharp": "fsi",
        "csharp": "scriptcs",
        "vbscript": "cscript //Nologo",
        "typescript": "ts-node",
        "coffeescript": "coffee",
        "scala": "scala",
        "swift": "swift",
        "julia": "julia",
        "crystal": "crystal",
        "ocaml": "ocaml",
        "r": "Rscript",
        "applescript": "osascript",
        "clojure": "lein exec",
        "haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt",
        "rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt",
        "racket": "racket",
        "scheme": "csi -script",
        "ahk": "autohotkey",
        "autoit": "autoit3",
        "dart": "dart",
        "pascal": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt",
        "d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt",
        "haskell": "runhaskell",
        "nim": "nim compile --verbosity:0 --hints:off --run",
        "lisp": "sbcl --script",
        "kit": "kitc --run",
        "v": "v run",
        "sass": "sass --style expanded",
        "scss": "scss --style expanded",
        "less": "cd $dir && lessc $fileName $fileNameWithoutExt.css",
        "FortranFreeForm": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "fortran-modern": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "fortran_fixed-form": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "fortran": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
    },
    "terminal.integrated.defaultProfile.windows": "PowerShell"
}

        这里只需要关注 “code-runner.executorMap”中的“c”属性。

"c": "cd $dir && gcc *.c -o $fileNameWithoutExt && $dir$fileNameWithoutExt",

        该指令为gcc编译了当前目录下所有的.c文件。 

c_cpp_properties.json        

        该文件用于配置C/C++项目的编译器和intellisense设置

        在vscode下按Ctrl+Shift+P或者F1来打开命令面板,并输入“edit configurations

        选择“编辑配置”,会在当前文件夹的.vscode文件中,生成c_cpp_properties.json文件

属性介绍

name

        代表在什么系统上运行

includePath

        编译文件的路径,默认是当前路径。可以根据需要进行修改,例如

${workspaceFolder}/**
defines

        定义符号,比如宏定义

cStandard

        略

cppStandard

        略

intelliSenseMode

        自动完成相关的配置

相关推荐

  1. vscode 编译c++文件

    2024-05-25 18:14:10       17 阅读
  2. linux c线程分段读取一个文件

    2024-05-25 18:14:10       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-25 18:14:10       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-25 18:14:10       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-25 18:14:10       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-25 18:14:10       18 阅读

热门阅读

  1. JVM-调优之-高内存占用问题排查

    2024-05-25 18:14:10       9 阅读
  2. OOM不会导致JVM退出

    2024-05-25 18:14:10       8 阅读
  3. 「Electron」Electron 应用程序详解

    2024-05-25 18:14:10       11 阅读
  4. 什么是UDP服务器?

    2024-05-25 18:14:10       7 阅读
  5. 根据标签名递归读取xml字符串中element

    2024-05-25 18:14:10       8 阅读
  6. 网络协议——有状态协议和无状态协议

    2024-05-25 18:14:10       9 阅读
  7. C#拼接xml

    2024-05-25 18:14:10       10 阅读
  8. xmlhttp中withcredential用法

    2024-05-25 18:14:10       11 阅读
  9. 使用HTTP客户端在Python中进行网页抓取——笔记

    2024-05-25 18:14:10       14 阅读
  10. Vue2常用的组件通信方式有几种

    2024-05-25 18:14:10       14 阅读