一、简介
很多时候,开发者需要使用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 的工作目录
-o:gcc参数, 用于指定输出文件的名称。如果不使用此参数,编译器默认生成可执行文件a.out。
-g:gcc参数,在可执行文件中加入源代码的信息,以便于调试。这并不意味着整个源文件被嵌入到可执行文件中,而是包含调试信息。
-c:gcc参数,只生成目标文件(.o文件),而不连接成为可执行文件。这个参数通常用于编译不包含主程序的子程序文件。
-I:gcc参数,指定头文件的文件夹。
更多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
自动完成相关的配置