一、简介
很多时候,开发者需要使用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
自动完成相关的配置