最新VS code配置C/C++环境(tasks.json, launch.json,c_cpp_properties.json)及运行多个文件、配置Cmake
thefg 2024-06-17 14:05:02 阅读 50
目录
一、VScode配置C/C++环境,需设置tasks.json, launch.json文件
二、安装C/C++扩展,配置tasks.json、launch.json、c_cpp_properties.json文件
(1)安装c/c++扩展
(2)配置tasks.json文件
(3)配置launch.json文件
(4)配置中的参数(属性)说明
(5)运行程序(运行单个或多个c/c++文件)
(6)关于配置多个任务task和启动调试launch
(7)配置c_cpp_properties.json文件、引入第三方库、指定头文件路径
三、vs code通过CMake构建工程(项目)环境运行C/C++
(1) Cmake、CMakeLists.txt、Makefile
(2)VS code中Cmake的环境配置
(3)tasks.json、launch.json文件配置
最新VS code配置C/C++环境(tasks.json, launch.json,c_cpp_properties.json)
及运行多个文件、配置Cmake
一、VScode配置C/C++环境,需设置tasks.json, launch.json文件
安装Visual Studio Code(VS Code)代码编辑器后,我们要运行c/c++语言,不仅要安装具有实现调试功能的C/C++扩展,而且安装该扩展后至少还需要配置launch.json,tasks.json这两个文件,这样就可以运行和调试c/c++程序。
在vs code中,有的语言安装具有实现调试功能的扩展(Extension)后,还需要配置多个文件,是由于这种编程语言的编译器种类多或编译过程分多阶段,我们需要进行设置,以便灵活达到个人需要。C/C++的编译器种类较多,而且它们的编译过程有预处理、编译、汇编和链接四个步骤,可见,C/C++语言具有编译器种类多、编译过程分多阶段的特点,因此,作为为一个轻量级的开发环境工具Vs Code,我们还需要额外地进行扩展的文件设置,以达到编译过程中对各个环节的个人需求设置,比如:设置编译器路径选择对应的编译器,设置头文件(.h)路径(预处理)、还可以设置库函数路径(链接)等。而python的编译过程相对比较单一,编译成字节码后解释执行,因此,在vscode中安装python的实现调试功能的扩展(Extension)后,可以不用特意配置文件来实现运行和调试。
VScode配置C/C++环境前,我们当然先要安装Vs Code和C/C++编译器,Vs Code的安装参见最新VS Code安装详细教程及vs code配置-CSDN博客,C/C++编译器的安装参见编译器(Compiler)及c/c++编译器安装(c+安装)-CSDN博客。
下面我们以windows系统为例, 在VS code里配置C/C++环境。
二、安装C/C++扩展,配置tasks.json、launch.json、c_cpp_properties.json文件
(1)安装c/c++扩展
在vscode和c/c++编译器安装好后,我们启动vscode,我们可以打开一个项目文件夹,如图2-1所示,bb1文件夹是存放项目文件的位置,Vscode会默认bb1也是一个workspace(工作区、工作空间)。
图 2-1 打开项目所在文件夹
单击图2-1左侧边栏的
扩展图标,在弹出的扩展搜索栏(如图2-2所示)的红色方框中输入c/c++搜索,下方会显示有关扩展(Extension),我们单击红色箭头所指的C/C++扩展,会出现install按键,单击install即可安装该扩展,该扩展具有智能感知(IntelliSense)、调试(debugging)等作用。
图 2-2 扩展搜索栏
C/C++扩展安装完后,会对应有launch.json、tasks.json、c_cpp_properties.json等文件,下面主要介绍Tasks.json、Launch.json、C_cpp_properties.json文件的配置。
(2)配置tasks.json文件
下面我们来配置tasks.json文件。tasks.json文件是设置将要执行的任务,也就是配置编译任务,该文件配置后我们写的代码才能被C/C++编译器正常编译。
图2-6 Terminal菜单
如图2-6所示单击vscode菜单栏的Terminal栏,单击红箭头所指的Configure Tasks...选项,弹出如图2-7所示的select a task to configure的菜单。
图2-7 select a task to configure
我们选择图2-7中红色箭头所指的Create tasks.json file from template选项,即从模板(样板)创建tasks.json,弹出如图2-8 select a task template的菜单选项。
图2-8 select a task template
我们选择图2-8中红色箭头所指的Others选项,即运行任意外部命令的例子(Example to run an arbitrary external command),如图2-9所示会打开一个tasks.json文件窗口,同时,bb1文件夹中会生成一个.vscode文件夹,tasks.json保存在这个文件夹里,后面即将讲到的launch.json、c_cpp_properties.json配置文件也都会保存在这个文件夹里。
图2-9 Tasks.json文件
图2-9的tasks.json是首次配置,默认为一个简单的配置,我们可以在tasks的中括号里进行配置,在配置路径时只能使用\\或/隔开目录,后面其它.json文件也一样。tasks.json文件配置内容如下:
{ "tasks": [ { "type": "cppbuild",//任务类型,可以取cppbuild、shell、process,三种执行时稍有差异,这里选择默认cppbuild。 "label": "build task 1",//任务标签(标记),也即任务名称,任务名称要和launch.json里的"preLaunchTask"值对应一致。 "command": "D:\\rewr\\mingw64\\bin\\gcc.exe",//编译器及其路径,.c用gcc.exe编译器,.cpp用g++.exe编译器,还可以是后面即将讲到的Cmake、make。 "args": [ "-fdiagnostics-color=always", "-g",//生成和调试有关的信息,launch.json会用到这些信息。 "${file}",//编译当前打开的.c(或.cpp)文件。 "-o",//指定编译的输出,windows系统下输出.exe文件,见下行。 //下面是windows系统下输出.exe文件及其路径,应该与launch.json的"program"的值代表的路径一致。 "${workspaceFolder}\\${fileBasenameNoExtension}.exe" ], "options": { "cwd": "${workspaceFolder}"//当前工作目录(路径)。 }, "problemMatcher": ["$gcc"],//使用gcc的问题匹配器。 "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ], "version": "2.0.0"}
把上面配置的内容替换掉图2-9的tasks.json文件的内容并保存即可,上面配置含义见其注释。
(3)配置launch.json文件
下面我们来配置launch.json文件。launch.json文件主要是有关启动任务、调试的配置,具有程序启动调试功能。launch.json文件会启用上面tasks.json的任务,并能实现调试功能。
单击左侧边栏运行与调试图标
,右侧出现run and debug按钮信息,如图2-10所示。
图 2-10 Run and Debug
首次配置,单击图2-10红色箭头所指的create a launch.json filie字体,出现图2-11右侧选择调试器(Select debugger)的菜单。
图2-11 选择调试器
我们选择图2-11红色箭头所指的C++(GDB/LLDB),如图2-12所示会打开一个launch.json窗口,同时,launch.json也保存在bb1文件夹中的.vscode文件夹里。这里的GDB、LLDB是可以作为C/C++的调试器(debugger)。
图2-12 Launch.json文件
图2-12的launch.json是首次配置,默认为空的,我们可以在configurations的中括号里进行配置。launch.json文件配置内容如下:
{ "configurations": [ { "name": "build launch 1",//自定义命名启动与调式的名称,将在左侧run and debug的菜单中显示名称。 "type": "cppdbg",// 配置类型,调试器类型,cppdbg为C/C++的调试类型。 "request": "launch",//配置请求类型,可以为launch(启动)或attach(附加)。 //下面是windows系统下需要调试的.exe文件及其路径,应该与tasks.json的输出的.exe文件及其路径一致。 "program": "${workspaceFolder}\\${fileBasenameNoExtension}.exe", "args": [],// 程序调试时传递给程序的命令行参数,一般设为空即可,这里提到的程序实际就上面的.exe文件,下同。 "stopAtEntry": false,// 设为true时程序将暂停在程序入口处,一般设置为false。 "cwd": "${workspaceFolder}",//当前工作目录(路径)。 "environment": [],//添加到程序的环境变量。 "externalConsole": false,//true开启外部控制台窗口,false会使用vscode内部控制台窗口。 "MIMode": "gdb",//使用gdb进行调试。 "miDebuggerPath": "D:\\rewr\\mingw64\\bin\\gdb.exe",//调试器debugger文件及其路径,调用gdb调试器。 "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "Set Disassembly Flavor to Intel", "text": "-gdb-set disassembly-flavor intel", "ignoreFailures": true } ], "preLaunchTask": "build task 1"//运行和调式前要启动的tasks任务,也即要启动的编译任务,任务名要和tasks.json里的"label"值对应一致。 } ], "version": "2.0.0"}
把上面配置的内容替换掉图2-12的launch.json文件的内容并保存即可,上面配置含义见其注释。
(4)配置中的参数(属性)说明
Tasks.json、Launch.json文件中的参数(属性)含义参见上面各文件中的注释。tasks.json的"label"的值应该与launch.json的"preLaunchTask"的值一致,否则,提示Could not find the task…报错。在两个文件中windows系统下.exe文件及其路径也要一致。
上面tasks.json、launch.json文件配置里,有的参数可以缺省,也可以增加参数,更多参数设置可以参考其他资料,这里不一一列举。
下面列出一些参数的含义。
${workspaceFolder} :表示当前workspace(工作区、工作空间)文件夹的路径,也即当前项目绝对路径,比如:当前项目绝对路径D:\pv\vsco\bb1。
${fileDirname}:表示当前打开的文件的绝对路径,但不包括文件名,比如:打开main.c文件,该文件所在的绝对路径(不包括文件名)为D:\pv\vsco\bb1\src。
${workspaceFolder}是workspace(工作区、工作空间)的绝对路径,${fileDirname}是当前打开的文件的绝对路径。
${workspaceFolder}/**:表示当前workspace文件夹的路径,而且还会递归搜索(recursive search,递归查找)所有子目录,比如:当前项目绝对路径D:\pv\vsco\bb1,不仅要搜索bb1文件夹,还会递归搜索bb1的所有子目录。
${workspaceRootFolderName}:表示workspace文件夹名,也即当前项目所在的文件夹的名称,比如:上面的bb1文件夹。
${file}:表示当前打开的文件,包括绝对路径,文件名,文件后缀名。
${relativeFile}:从当前所在的绝对路径打开其子路径的文件,即以相对路径打开文件,比如:文件main.c的绝对路径为D:\pv\vsco\bb1\src\main.c,若当前是在bb1文件夹位置,使用${relativeFile}设置,则是在当前所处的bb1位置以src \main.c的子路径打开main.c。
${fileBasename}:当前打开的含有后缀的文件名,不包括路径。
${fileBasenameNoExtension}:表示当前打开的文件名,但不包括路径和后缀名。
cwd:current working directory,当前工作目录,它是操作系统当前正在运行的进程所在的目录。在命令行界面(比如,cmd)中,用户输入命令时,默认情况下会在cwd下执行。
更多参数含义参考Visual Studio Code Variables Reference。
(5)运行程序(运行单个或多个c/c++文件)
利用上面配置我们将运行下面几个文件:
ff1.c文件:
#include "fhh.h"int main(){ func(); return 0; }
pp1.c文件:
#include <stdio.h>void func(){ printf("Good morning!\n");}
fhh.h文件:
void func(); //声明declare
test.c文件:
#include <stdio.h>int main(){ printf("Hello world!\n"); return 0;}
按上面配置完成后,我们可以运行程序了,但tasks.json文件中使用了"${file}"参数,表示编译当前打开的.c(或.cpp)文件,按这个配置,vscode只能编译一个.c(或.cpp)文件,可以运行上面的test.c文件,编译时不涉及到我们定义的其他文件。但不能运行ff1.c文件,因为涉及到调用pp1.c文件的函数。如果我们的程序要调用其他文件的函数,也就是要编译多个文件,用"${file}"是不能实现的,运行代码,vs code的终端TERMINAL显示collect2.exe: error: ld returned 1 exit status,并弹窗提示The prelaunchTask … terminated wiht exit code -1报错。这时候,我们需要把各文件路径放到里面去,即"${file}"参数更换成各个文件路径的参数。我们以上面ff1文件运行为例,tasks.json内容更改如下:
{ "tasks": [ { "type": "cppbuild",//任务类型,可以取cppbuild、shell、process,三种执行时稍有差异,这里选择默认cppbuild。 "label": "build task 1",//任务标签(标记),也即任务名称,任务名称要和launch.json里的"preLaunchTask"值对应一致。 "command": "D:\\rewr\\mingw64\\bin\\gcc.exe",//编译器及其路径,.c用gcc.exe编译器,.cpp用g++.exe编译器,还可以是后面即将讲到的Cmake、make。 "args": [ "-fdiagnostics-color=always", "-g",//生成和调试有关的信息,launch.json会用到这些信息。 "${workspaceFolder}\\ff1.c", "${workspaceFolder}\\pp1.c", "-o",//指定编译的输出,windows系统下输出.exe文件,见下行。 //下面是windows系统下输出.exe文件及其路径,应该与launch.json的"program"的值代表的路径一致。 "${workspaceFolder}\\${fileBasenameNoExtension}.exe" ], "options": { "cwd": "${workspaceFolder}"//当前工作目录(路径)。 }, "problemMatcher": ["$gcc"],//使用gcc的问题匹配器。 "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ], "version": "2.0.0"}
按上面更改tasks.json的配置,launch.json保持不变,点击图2-13的红色箭头按钮或Vscode菜单栏run里面的运行选项即可运行ff1.c文件。
图2-13 运行ff1文件
运行多个C/C++文件,需要把运行有关的.c(或.cpp)文件及其路径写入到tasks.json里,才能正常运行。
上面配置中,不论是.c文件,还是.exe文件都是在bb1文件夹,也即当前workspace(工作区、工作空间),如图2-12左侧的文件浏览窗口。我们也可以在配置时指定其他位置存放.c文件和.exe文件,在配置中写好对应的路径即可,这里不一一列举。
(6)关于配置多个任务task和启动调试launch
上面我们是配置一个任务task,一个启动调试launch,我们可以在上面tasks.json文件里配置多个任务,多个任务是根据"label"来引用的,在launch.json文件里配置多个启动调试,多个启动调试是用"name"来引用的,如图2-13红色箭头所指处的下拉栏中会显示已经配置的各个启动调试的"name",我们可以根据某个名称的启动调试来运行程序。各个启动调式都也会对应某个任务。另外,我们在vscode右侧浏览窗口打开launch.json文件,右下侧有Add Configuration…提示按键,单击进入里面的菜单我们可以选择某个种类。
这里我们不列举配置多个任务task和对应的启动调试launch的情形,其原理是一样的,只是在.json文件里面增加类似的参数,多个任务task的每个任务用大括号区分开,同理,多个启动调试launch。
(7)配置c_cpp_properties.json文件、引入第三方库、指定头文件路径
c_cpp_properties.json文件的内容主要是对编辑环境的配置,主要是针对IntelliSense(智能感知)引擎的有关配置。intelliSense是各种代码编辑功能的通用术语,包括:代码补全、参数信息提示、快速信息描述提示和成员列表提示等,因而,intelliSense也称为代码提示(code hinting)。
当我们装了C/C++编译器,并在vs code中安装了具有调试功能的C/C++扩展(Extension)后,会自动产生默认的c_cpp_properties.json配置。上面tasks.json、launch.json文件配置完后,我们就运行C/C++程序了,也是采用默认的c_cpp_properties.json配置。另外,这个三个.json文件无须额外设置,默认允许调用内置的标准库及头文件(.h文件),以及当前workspace(工作区、工作空间)下的头文件(.h文件)。也就是讲,如果没有特别要求,一般我们可以不用配置c_cpp_properties.json,按上面配置完tasks.json、launch.json后就可以运行代码了。但我们要指定头文件、库的位置,我们需要配置c_cpp_properties.json、tasks.json文件。
我们可以通过Vs code的菜单栏View→Command Palette打开命令面板,输入关键词C/C++ edit,弹出如图2-14菜单选项,选择匹配到的命令C/C++: Edit Configurations (UI)或C/C++: Edit Configurations (JSON),也会在当.vscode文件夹中生成c_cpp_properties.json文件。其中,UI(用户界面、User Interface)是提供一个可视化的界面手动设置,JSON是c_cpp_properties.json文件形式的设置。
图2-14 Edit Configurations
这里我们选择C/C++: Edit Configurations (JSON),因为c_cpp_properties.json文件设置更灵活,可以进行多种配置。如图2-15所示vs code的右侧出现c_cpp_properties.json的默认配置的文件窗口,同时,c_cpp_properties.json也保存在bb1文件夹中的.vscode文件夹里。
图2-15 c_cpp_properties.json文件的默认配置
上图2-15的c_cpp_properties.json文件的默认配置的注释如下:
{ "configurations": [ { //名称,操作系统根据这个名称识别对应的属性配置。windows系统:Win32,Linux系统:Linux,macOS系统:Mac。 "name": "Win32", //头文件路径,以便IntelliSense(智能感知)引擎的搜索。 //下面compilerPath设置了编译器路径,则系统的(C/C++内置的)头文件路径不需要再在下面标出。 "includePath": [ "${workspaceFolder}/**"//当前项目所在根目录并递归搜索子目录,也即当前workspace文件夹的路径,而且还会递归查找所有子目录。 ], //IntelliSense(智能感知)引擎在分析文件时要使用的预处理器定义的列表。 "defines": [ "_DEBUG", "UNICODE", "_UNICODE" ], //根据下面这个路径查询编译器,以便启用更准确的IntelliSense(智能感知),因为IntelliSense有几种模式,见下面配置。 //这里并不是调用编译器,真正启用编译器编译的是在tasks.json文件里。 //下面值为空,则默认找到的任何编译器。 "compilerPath": "D:\\rewr\\mingw64\\bin\\gcc.exe", "cStandard": "c17",//用于IntelliSense(智能感知)引擎的c标准(版本)。 "cppStandard": "gnu++14",//用于IntelliSense(智能感知)引擎的c++标准(版本)。 //IntelliSense有几种模式,Windows系统:windows-msvc-x64,Linux系统:linux-gcc-x64,macOS系统:macos-clang-x64。 "intelliSenseMode": "windows-gcc-x64" } ], "version": 4}
我们可以在c_cpp_properties.json文件里针对多个操作系统配置IntelliSense属性,vs code 运行代码时根据"name"来唯一识别调用,各个操作系统的IntelliSense属性配置用大括号区分开,这里不一一列举。
下面我们在vs code中配置c/c++中增加引入第三方库的配置。这里以引入第三方库包(openssl)为例,在c_cpp_properties.json、tasks.json文件里增加头文件、库的路径配置,从而实现添加第三方库的效果,从这个例子我们也可以看到VSCode C/C++对头文件路径、库的配置。
OpenSSL由多个库文件组成的库包,是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。
库文件是经过编译器编译好的二进制文件,库函数是库文件的组成部分,而我们在代码中定义的函数是没有经过编译器编译过的,因而库函数与用户自定义的函数是有区别的。另外,C/C++的库函数都有头文件(.h)。
在配置c_cpp_properties.json、tasks.json中头文件、库的路径前,我们先要安装OpenSSL库包,windows系统可以下载别人已经过编译器编译好的安装文件:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions。安装好OpenSSL后,我们根据OpenSSL的安装地址及要使用的库文件,来配置tasks.json、c_cpp_properties.json中头文件、库的路径,这里以下面的hh.c文件为例。
hh.c文件:
#include <stdio.h>#include<openssl/evp.h>//表示头文件目录下的openssl目录下的evp.h文件。 int main() { OpenSSL_add_all_algorithms(); printf("The OpenSSL is installed successfully!\n"); return 0;}
hh.c文件的头文件evp.h会调用库包OpenSSL中的库文件libcrypto,我们根据OpenSSL的安装地址及要使用的库文件libcrypto,配置tasks.json、c_cpp_properties.json中头文件、库的路径。
tasks.json文件配置如下:
{ "tasks": [ { "type": "cppbuild",//任务类型,可以取cppbuild、shell、process,三种执行时稍有差异,这里选择默认cppbuild。 "label": "build task 1",//任务标签(标记),也即任务名称,任务名称要和launch.json里的"preLaunchTask"值对应一致。 "command": "D:\\rewr\\mingw64\\bin\\gcc.exe",//编译器及其路径,.c用gcc.exe编译器,.cpp用g++.exe编译器。 "args": [ "-fdiagnostics-color=always", "-g",//生成和调试有关的信息,launch.json会用到这些信息。 "${file}",//编译当前打开的.c(或.cpp)文件。 "-I",//-I(大写i)声明为头文件路径。 //下面是第三方库的头文件位置,不指出完整路径,但代码中#include后面需要补全位置。 "C:\\Program Files\\OpenSSL-Win64\\include", "-L",// -L 声明为库文件路径。 //使用的第三方库位置,需要指出完整位置。 "C:\\Program Files\\OpenSSL-Win64\\lib\\VC\\x64\\MD", //-l(小写L)声明为库文件。 "-l", "libcrypto",//要调用的库文件。 "-o",//指定编译的输出,windows系统下输出.exe文件,见下行。 //下面是windows系统下输出.exe文件及其路径,应该与launch.json的"program"的值代表的路径一致。 "${workspaceFolder}\\${fileBasenameNoExtension}.exe" ], "options": { "cwd": "${workspaceFolder}"//当前工作目录(路径)。 }, "problemMatcher": ["$gcc"],// 使用gcc的问题匹配器。 "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ], "version": "2.0.0"}
c_cpp_properties.json文件配置如下:
{ "configurations": [ { //名称,操作系统根据这个名称识别对应的属性配置。windows系统:Win32,Linux系统:Linux,macOS系统:Mac。 "name": "Win32", //头文件路径,以便IntelliSense(智能感知)引擎的搜索。 //下面compilerPath设置了编译器路径,则系统的(C/C++内置的)头文件路径不需要再在下面标出。 "includePath": [ "${workspaceFolder}/**",//当前项目所在根目录并递归搜索子目录,也即当前workspace文件夹的路径,而且还会递归查找所有子目录。 "C:\\Program Files\\OpenSSL-Win64\\include"//第三方库的路径。代码中#include后面需要补全位置,这里可以缺省\\**。 ], //IntelliSense(智能感知)引擎在分析文件时要使用的预处理器定义的列表。 "defines": [ "_DEBUG", "UNICODE", "_UNICODE" ], //根据下面这个路径查询编译器,以便启用更准确的IntelliSense(智能感知),因为IntelliSense有几种模式,见下面配置。 //这里并不是调用编译器,真正启用编译器编译的是在tasks.json文件里。 //下面值为空,则默认找到的任何编译器。 "compilerPath": "D:\\rewr\\mingw64\\bin\\gcc.exe", "cStandard": "c17",//用于IntelliSense(智能感知)引擎的c标准(版本)。 "cppStandard": "gnu++14",//用于IntelliSense(智能感知)引擎的c++标准(版本)。 //IntelliSense有几种模式,Windows系统:windows-msvc-x64,Linux系统:linux-gcc-x64,macOS系统:macos-clang-x64。 "intelliSenseMode": "windows-gcc-x64" } ], "version": 4}
Launch.json保持前面的配置,无须修改,上面配置好tasks.json、c_cpp_properties.json文件后,就可以运行hh.c文件了,如图2-16所示。
图2-16 配置引入第三库后,运行hh.c文件
上面tasks.json文件的配置与前面的配置基本类似,仅仅增加了头文件、库的路径,上面配置库文件路径要指明完整路径,若写成"C:\\Program Files\\OpenSSL-Win64\\lib",会显示cannot find -llibcrypto,collect2.exe: error: ld returned 1 exit status,弹窗提示The prelaunchTask build task 1 terminated wiht exit code -1。
上面c_cpp_properties.json文件的配置与前面的配置基本类似,仅仅增加了头文件的路径。
若要用到更多的头文件、库的路径等,可以在tasks.json文件中类似增加,比如:增加”-I”和头文件路径,同理,c_cpp_properties.json文件。
通过vs code菜单栏File→Preferences→Settings→User→Extensions→IntelliSense找到C_Cpp.intelliSenseEngine设置(也可以在Settings窗口的搜索栏直接搜索C_Cpp.intelliSenseEngine),也即intelliSense引擎设置,我们看到里面采用的是默认(default)设置,若选择了Tag Parser设置,对有的程序代码,上面c_cpp_properties.json的配置中可能需要增加类似下面语句:
"browse": { "path": ["C:\\Program Files\\OpenSSL-Win64\\lib","${workspaceFolder/**}"] }
上面讲述了Vs code配置c/c++环境的tasks.json、launch.json、c_cpp_properties.json文件,配置的内容是用短号隔开的,每个短号放一行,实际可以放多行。只要用逗号隔开,可以把相关的放到一行,更多有关这三个文件的配置参考Get Started with C++ and MinGW-w64 in Visual Studio Code和c_cpp_properties.json reference。
三、vs code通过CMake构建工程(项目)环境运行C/C++
上面我们在vs code中安装c/c++扩展,配置tasks.json、launch.json后可以运行C/C++程序,但若运行的项目文件比较多,用上述方法比较麻烦,下面我们介绍CMake工具,通过cmake管理程序的编译,可以提高项目管理效率,不论是运行单个文件还是运行多个文件更加自动化。
(1) Cmake、CMakeLists.txt、Makefile
Cmake主要用于软件构建、测试和打包,是一个跨平台的自动化构建系统工具,常常用于控制软件项目的编译和构建过程。
Cmake使用平台无关的、描述构建过程的CMakeLists.txt文件来控制软件编译过程,并生成可以在用户选择的编译器环境中使用的项目文件。CMake通过读取CMakeLists.txt文件来生成相应的项目文件和makefile,从而控制整个构建过程。
CMakeLists.txt文件是一个与平台无关的、用于定制编译流程的文件(也即一个描述编译链接的规则文件)。cmakeList.txt中指令不区分大小写,但CMakeList.txt中的参数和变量是区分大小写,名称只能用字母,数字,下划线,破折号。
Makefile的主要作用包括自动化编译和链接、管理依赖关系、跳过不必要的编译,以及执行其他任务,如清理临时文件或生成文档。
在VS code中使用CMake,我们先要在电脑中安装CMake工具,而且还要在Vs code中安装CMake和CMake Tools两个扩展(Extension),若要运行C/C++,也要在vs code中安装C/C++扩展。
vscode会借助扩展调用和管理Cmake。若没有先在电脑中安装Cmake工具,vscode提示bad cmake executable:"".Check to make sure it is installed or the "cmake.cmakePath" setting contains the correct path,运行程序代码提示The prelaunchTask … terminated with exit code -1。
我们先到CMake官网CMake - Upgrade Your Software Build System下载已经编译过的二进制(Binary)安装文件安装到电脑里(注意,不要下载源代码(Source)文件,这种文件没有编译过)。
在windows安装Cmake时,注意选择Add CMake to the system PATH for …,这样增加到系统的环境变量。
环境变量是在操作系统中一个具有特定名字的对象,它代表了一个或者多个应用程序所将使用到的信息。当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还会到环境变量path中指定的路径去找可运行的对象。
环境变量中的系统变量是对所有用户有效,用户变量是对当前登录的windows账号有效,当系统变量查找不到时,会到当前用户变量中查找。另外,环境变量名称是不区分大小写的,比如:PATH和path,两个名称是一样的。
(2)VS code中Cmake的环境配置
下面我们需要在vs code中配置上面已经安装的Cmake工具的环境。
Cmake安装完成后,在Vs code中安装CMake扩展(Extension)、CMake Tools扩展、C/C++扩展,我们可以安装C/C++ Extension Pack扩展,该扩展含有上述三个扩展。CMake扩展让VS Code支持Cmake语言,CMake Tools让VS Code提供Cmake一个强大的工作流, 用于在Visual Studio Code(vs code)中配置、构建、浏览和调试基于CMake的项目。
注意,这里提到的两个CMake的概念是有区别的,一个是具有编译器特点的可执行文件,一个是vs code的扩展(Extension),扩展通常用来载入软件中,使得软件具有某种额外的功能。
我们打开一个项目,在项目根目录下,也即当前workspace(工作区、工作空间),创建一个build文件夹,将用来存放CMake通过读取CMakeLists.txt文件来生成相应的项目文件和makefile,如图3-1所示。
图3-1 VS code 资源浏览器
在项目根目录下创建一个CmakeLists.txt文件(如图3-1红色箭头所指),该文件暂时可以为空文件,也可以先配置好,这里配置好CmakeLists.txt文件。
CmakeLists.txt文件配置如下:
#cmake最低版本需求,不加入此行会受到警告信息,输入下载安装的cmake版本。cmake_minimum_required(VERSION 3.29)#项目名称,即生成的.exe文件名称,这里的文件名称必需与launch.json的参数"program"的一致。#这个文件是保存在tasks.json的指定的目录,在本例中是build文件夹。project(main) #把当前目录.下所有源文件加入变量SRC_LIST,#这里的.代表当前目录,也即当前workspace(工作区、工作空间),本例中cc1文件夹位置。aux_source_directory(. SRC_LIST)#生成应用程序main,在windows下会自动生成main.exe。add_executable(main ${SRC_LIST})
上面CmakeLists.txt文件配置,使用了最基本的Cmake命令语句,更多cmake的代码语句可以参考相关资料。
由于Cmake配置是依赖CmakeLists.txt文件的,应该先创建CmakeLists.txt文件,然后进行下面的配置cmake(这里面含有配置Cmake需要调用的编译器,在本例中是调用c/c++的编译器),否则,在下面配置cmake时会提示搜索查找CmakeLists.txt文件。
打开vs code菜单栏File→View→Command Palette…,在搜索框中输入Cmake,如图3-2所示。
图3-2 Command Palette搜索栏
我们选择图3-2红色箭头所指的Cmake:Configure,弹出如图3-3配置Cmake。
图3-3 Select a Kit
我们选择图3-3红色箭头的选项,选择c/c++编译器完成Cmake配置。VS CODE会自动完成配置,同时,图3-3的build文件夹会自动生成CMake通过读取CMakeLists.txt文件来生成相应的项目文件和makefile,如图3-4所示。
图3-4 vscode中CMake生成的文件
实际上,安装cmake后,再打开vscode,也会提示我们配置cmake,如图3-5所示,我们也可以通过图3-5来配置Cmake。
图3-5 Cmake Tools配置项目
(3)tasks.json、launch.json文件配置
按前面的方法打开tasks.json、launch.json文件,分别配置这两个文件。
tasks.json文件配置如下:
{ "tasks": [ { //Cmake active file 操作,要和launch.json里的"preLaunchTask"值对应一致。 "label": "Cmake active file", "dependsOn":[ //Cmake active file操作依赖于下面的cmake和 make操作,也即调用下面两个标签label的操作。 "cmake", "make" ] }, { "label": "cmake",//cmake操作。 "type":"shell", "command":"cmake",//执行cmake操作所使用的命令。 "args": [ //cmake命令执行时的命令行参数。 "-G MinGW Makefiles", //生成 mingw32-make 能够编译的Makefile。 "../" ], }, { "label": "make", //make 操作。 "command":"mingw32-make.exe", //执行 make 操作所使用的命令(mingw32-make.exe已经添加了环境变量)。 "args": [ ], "options": { "cwd": "${workspaceFolder}\\build" //表示执行当前操作的工作目录。 } }, ], "version": "2.0.0", "options": { "cwd": "${workspaceFolder}\\build" //表示执行上述操作时的工作目录。 },}
这里的tasks.json是调用已安装的Cmake和mingw32-make.exe。上面make实际是调用我们安装c/c++的编译器套件MinGW-w64中的mingw32-make.exe命令,编译器套件MinGW-w64的安装参考编译器(Compiler)及c/c++编译器安装(c+安装)-CSDN博客。
CMake充当构建工程系统的生成器,而Make专注于执行Makefile中指定的构建指令。为了运行大型项目,我们首先编写CMakeLists.txt,然后,通过cmake命令就可以生成makefile文件,再通过make命令就可以使用这个makefile文件,从而生成可执行文件。
launch.json文件配置如下:
{ "configurations": [ { "name": "build and debug active file", "type": "cppdbg", "request": "launch", //下面是windows系统下需要调试的.exe文件及其路径,应该与CmakeLists.txt文件中project的文件名一致。 "program": "${workspaceFolder}\\build\\main.exe", "args": [], "stopAtEntry": false, //使用${fileDirname},需要先打开项目的一个c/c++文件再运行, //因为这个值表示打开的文件所在的绝对路径,因而需要打开一个文件来确定路径, //否则,提示variable ${fileDirname} can not be resolved。 //下面也可以用${workspaceFolder},表示工作台下的路径,这个值不需要打开文件来确定路径。 "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "D:\\rewr\\mingw64\\bin\\gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "Set Disassembly Flavor to Intel", "text": "-gdb-set disassembly-flavor intel", "ignoreFailures": true } ], "preLaunchTask": "Cmake active file"//要和tasks.json里的"label"值对应一致。 } ], "version": "2.0.0" }
上面(2)、(3)配置没有先后关系,(2)、(3)配置完成后就可以运行程序了,如图3-6所示。
图3-6 VS code中Cmake环境运行C/C++
经过上述配置后,我们可以运行与项目有关的文件,若其中含有与项目无关的文件,运行时,终端TERMINAL会提示Terminal will be reused by tasks,即终端被多个任务重用,弹出The preLaunchTask … terminated with exit code 2异常,我们可以把项目相关文件放到一个文件夹里,在CmakeLists.txt中修改aux_source_directory(dir variable)的指定目录的dir参数,如图3-7所示,在本例中我们可以增加一个src文件夹存放上述三个文件,aux_source_directory(. SRC_LIST)命令修改为aux_source_directory(src SRC_LIST)。通过这种方式把与项目无关的文件隔离开来,只运行与项目有关的这个文件夹src,就可以避免上述异常。
图3-7 CmakeLists.txt命令设置
图3-7 的CmakeLists.txt文件配置如下:
#cmake最低版本需求,不加入此行会受到警告信息,输入下载安装的cmake版本。cmake_minimum_required(VERSION 3.29)#项目名称,即生成的.exe文件名称,这里的文件名称必需与launch.json的参数"program"的一致。#这个文件是保存在tasks.json的指定的目录,在本例中是build文件夹。project(main) #把当前目录src下所有源文件加入变量SRC_LIST,#这里的src代表存放源文件的目录,也即当前workspace(工作区、工作空间下的src文件夹,#本例中也即D:/pv/vsco/cc1/src。aux_source_directory(. SRC_LIST)#生成应用程序main,在windows下会自动生成main.exe。add_executable(main ${SRC_LIST})
上面简单介绍了vs code通过CMake构建工程(项目)环境,只是一个抛砖引玉的作用,更多有关CMake构建工程(项目)环境的知识,可以参考其他相关资料。
最后,欢迎你点击下面链接参与一个小问卷,你的举手之劳,让博主受宠若惊,不胜感激!
https://www.wjx.cn/vm/w42huU2.aspx#
上一篇: python头歌实践教学平台-python第三章作业(初级)
下一篇: FFmpeg开发笔记全目录(FFmpeg开发实战详解,含直播系统的搭建过程)
本文标签
最新VS code配置C/C++环境(tasks.json c_cpp_properties.json)及运行多个文件、配置Cmake launch.json
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。