vscode 的配置分两类,一是全局的用户配置,二是当前工作区配置。vscode 打开的文件夹的根目录是一个工作区,.vscode目录就是存放当前工作区相关配置文件的目录。
这样分享项目时,也把该项目的 vscode 配置分享出去了,保证了协同工作开发环境的统一性。
.vscode目录下配置文件:
c_cpp_properties.json:是用于配置编译器环境的,包括启动器代号、位数(这些是自定义的)、编译选项、启动设置、编译模式等;includePath指向C/C++标准库、用户头文件所在位置;
setting.json:vscode编辑器和插件的相关配置;
launch.json:调试配置文件;
task.json:任务配置。
配置文件中一些常见的配置信息:
• version:版本号,不用修改
• configurations:数组类型,用来配置 每一项调试任务的具体配置信息
• type:调试环境的具体类型 node、java、cppdbg 等等
• name:调试任务的名称,用与在下拉列表中展示
• program:启动文件的路径,对于该路径中的变量,下面在介绍
• request:调试模式,一共有两种模式
• env
:对象,程序启动是传递的环境变量
• args
:程序启动是传递的参数
• cwd
:程序启动是的跟目录配置
• window
:为 window 平台单独设置配置项
• linux
:为 linux 平台单独设置配置项
• osx
:为 Mac OS 平台单独设置配置项
• ${workspaceFolder}:项目文件夹在 VS Code 中打开的路径
• ${file}:当前开打开(激活)的文件
• ${relativeFile}:相对于 {workspaceFolder} 的文件路径
• ${fileBasename}:当前打开文件的名称
• ${fileBasenameNoExtension}:当前打开文件的名称,不带扩展名的
• ${fileExtname}:当前打开文件的扩展名
• ${fileDirname}:当前打开文件的文件夹名称
注:以下操作是在Vscode安装好后,gcc编译器下载好,环境变量添加完成后进行;
下面编译一个测试程序:
打开vscode,在里面创建一个工程,工程下面分别创建以下几个文件夹“:build;src;inc;output;intput;doc”
build文件夹:用来存放编译好的可执行的.exe二进制文件
src文件夹:用来存放各个功能模块的源文件
inc文件夹:用来存放各个功能模块的头文件
output文件夹:用来存放输出文件
intput文件夹:用来存放输入文件
doc文件夹:用来存放项目工程的说明文档
好啦,来看看我们的工程长什么样!(仅是个人习惯,文件夹可以随自身习惯建立自己喜欢的)
在src文件夹下创建main.c和rgb.c文件:
#include
int main(int argc, char *argv[])
{
rgb();
printf("读取bin文件结果:success\n");
printf("long = %d,wide = %d\n",long,wide);
system("pause");
return 0;
}
#include
void rgb()
{
printf("读取rgb文件结果:success\n");
}
在inc文件夹下创建sys.h和rgb.h文件:
#ifndef _SYS_H_
#define _SYS_H_
#include
#define long 2560 //宏定义分辨率
#define wide 1440
#endif
#ifndef _RGB_H_
#define _RGB_H_
#include
#include
#include
void rgb();
#endif
以上测试程序仅为了在inc下也有多个头文件,实际使用写在sys.h一个头文件里也可以。
c_cpp_properties.json文件中,includePath指向C/C++标准库、用户头文件所在位置;c_cpp_properties.json文件夹如下:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceRoot}",
"D:/mingw64/include/**",
//"D:/my_code/isp_pipline/inc", //新建工程项目加上该工程项目的头文件夹绝对路径
"${workspaceFolder}\\inc", //新建工程项目加上该工程项目的头文件夹相对路径
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include-fixed",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/include"
],
"defines": [
"_DEBUG",
"UNICODE",
"__GNUC__=6",
"__cdecl=__attribute__((__cdecl__))"
],
"intelliSenseMode": "msvc-x64",
"browse": {
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": "",
"path": [
"${workspaceRoot}",
"D:/mingw64/include/**",
//"D:/my_code/isp_pipline/inc", //新建工程项目加上该工程项目的头文件夹绝对路径
"${workspaceFolder}\\inc", //新建工程项目加上该工程项目的头文件夹相对路径
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include-fixed",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/include"
]
}
}
],
"version": 4
}
可以在下面红框的位置加上上面新建工程中inc文件夹的绝对路径
当然上图中修改方式并不好,加上新建项目头文件绝对路径,那么每建立一个项目就要加一个绝对路径过于繁琐,可以在下图红框中位置加上"${workspaceFolder}\\inc",表示该项目文件夹下的inc文件夹,是相对路径。
tasks.json文件:
{
"version": "2.0.0",
"tasks": [
{//这个大括号里是‘构建’任务
"label": "echo",//这个大括号里是‘构建’任务
"type": "shell",//任务类型,process是vsc把预定义变量和转义解析后直接全部传给command;shell相当于先打开shell再输入命令,所以args还会经过shell再解析一遍
"command": "gcc", //编译命令
"args": [ //传给gcc命令的一系列参数
"-g", //生成和调试有关的信息
"${workspaceFolder}\\src\\*.c", //新建工程项目加上该工程项目的源码文件夹路径
"-I","${workspaceFolder}\\inc", //新建工程项目加上该工程项目的头文件夹路径
"-o", //指定输出文件的路径和名称
"${workspaceFolder}\\build\\total.exe",//让可执行文件输出到源码文件所在的文件夹下的bin文件夹内,并且让它的名字和源码文件相同
"-fexec-charset=GBK"//解决中文乱码
]
}
],
"presentation": {//执行这个任务时的一些其他设定
"echo": true,//表示在执行任务时在终端要有输出
"reveal": "always",//执行任务时是否跳转到终端面板,可以为always,silent,never
"focus": false,//设为true后可以使执行task时焦点聚集在终端,但对编译来说,设为true没有意义,因为运行的时候才涉及到输入
"panel": "new", //每次执行这个task时都新建一个终端面板
"showReuseMessage": true,//控制是否显示“终端将被任务重用, 按任意键关闭”提示.
"clear": false
}
}
tasks.json文件修改下图红框的位置;为了调试方便使用-g让可执行程序包含调试信息,用-I指定头文件路径;-o指定输出文件的路径和名称
下面的参数表示意思如下:
gcc -g ${workspaceFolder}\\src\\*.c -I ${workspaceFolder}\\inc -o ${workspaceFolder}\\build\\total.exe
编译的修改方式有很多,比如改成
gcc -c ${workspaceFolder}\\src\\*.c -I ${workspaceFolder}\\inc 也可以编译,如下图
launch.json文件如下:
{
"version": "0.2.0",
"configurations": [
{/*这个大括号里是我们的‘调试(Debug)’配置,这里我解释下为什么写了两个,
因为有时VSCode会有闪现的问题,也就是运行程序后窗口控制台可能会一闪而过,
看不到结果,因此可以通过搭建configution的办法来解决,也就是搭建一个cmd的配置。*/
"name": "(Windows) Launch",// 配置名称
"type": "cppvsdbg",// 配置类型,cppdbg对应cpptools提供的调试功能;可以认为此处只能是cppdbg
"request": "launch",// 请求配置类型,可以为launch(启动)或attach(附加)
"program": "cmd",// 将要进行调试的程序的路径
"preLaunchTask": "echo", // 调试开始前执行的任务,我们在调试前要编译构建。与tasks.json的label相对应,名字要一样
"args": [ // 程序调试时传递给程序的命令行参数
"/C",
"${workspaceFolder}\\build\\total.exe",
"&",
"echo."
],
"stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
"cwd": "${workspaceFolder}",// 调试程序时的工作目录,此处为源码文件所在目录
"environment": [],// 环境变量,这里设为空即可
"console": "externalTerminal",//使用单独的cmd窗口输出
},
{//这个大括号里是我们的‘调试(Debug)’配置
"name": "(gdb) Launch",// 配置名称
"type": "cppdbg",// 配置类型,cppdbg对应cpptools提供的调试功能;可以认为此处只能是cppdbg
"request": "launch",// 请求配置类型,可以为launch(启动)或attach(附加)
//"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",// 将要进行调试的程序的路径
"program": "C:\\Windows\\system32\\cmd.exe",
"args": [
"/C",
"${workspaceFolder}\\build\\total.exe",
"&",
"pause"
], // 程序调试时传递给程序的命令行参数,
"stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
"cwd": "${workspaceFolder}",// 调试程序时的工作目录,此处为源码文件所在目录
"environment": [],// 环境变量,这里设为空即可
//"console": "externalTerminal",// 使用单独的cmd窗口输出
"externalConsole": true,
"MIMode": "gdb", //指定连接的调试器,gdb是minGW中的调试程序
"miDebuggerPath": "D:\\mingw64\\bin\\gdb.exe",//指定调试器所在路径,如果你的minGW装在别的地方,则要改成你自己的路径,注意间隔是\\
"preLaunchTask": "echo",//调试开始前执行的任务,这里和task.json的label相对应
}
]
}
将下图红框中的位置改为需要输出的可执行文件的路径即可,调试使用的路径。
setting.json不做修改
{
"files.associations": {
"cctype": "c",
"climits": "c",
"cmath": "c",
"cstdarg": "c",
"cstdint": "c",
"cstdio": "c",
"cstdlib": "c",
"limits": "c",
"type_traits": "c"
}
}
如下图所示,修改上方配置后,按F5测试代码生成结果如下红框中,build文件夹下生成了total.exe可执行文件;终端上是编译命令;
针对只编译当前打开的文件,setting.json和c_cpp_properties.json不需要动;
将tasks.json修改成下图红框中的内容;
表示编译当前打开的文件在当前建立的项目的build文件夹下生成当前打开的文件名称的exe可执行文件。
依据自己的习惯对生成文件的路径和名称做调节:${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe
{
"version": "2.0.0",
"tasks": [
{//这个大括号里是‘构建’任务
"label": "echo",//这个大括号里是‘构建’任务
"type": "shell",//任务类型,process是vsc把预定义变量和转义解析后直接全部传给command;shell相当于先打开shell再输入命令,所以args还会经过shell再解析一遍
"command": "gcc", //编译命令
"args": [ //传给gcc命令的一系列参数
/*"-g", //生成和调试有关的信息
"${workspaceFolder}\\src\\*.c", //新建工程项目加上该工程项目的源码文件夹路径
"-I","${workspaceFolder}\\inc", //新建工程项目加上该工程项目的头文件夹路径
"-o", //指定输出文件的路径和名称
"${workspaceFolder}\\build\\total.exe",//让可执行文件输出到源码文件所在的文件夹下的bin文件夹内,并且让它的名字和源码文件相同
"-fexec-charset=GBK"//解决中文乱码*/
"-g", //生成和调试有关的信息
"${file}", //指定要编译的是当前文件
"-o", //指定输出文件的路径和名称
"${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe",//让可执行文件输出到源码文件所在的文件夹下的bin文件夹内,并且让它的名字和源码文件相同
"-fexec-charset=GBK"//解决中文乱码
]
}
],
"presentation": {//执行这个任务时的一些其他设定
"echo": true,//表示在执行任务时在终端要有输出
"reveal": "always",//执行任务时是否跳转到终端面板,可以为always,silent,never
"focus": false,//设为true后可以使执行task时焦点聚集在终端,但对编译来说,设为true没有意义,因为运行的时候才涉及到输入
"panel": "new", //每次执行这个task时都新建一个终端面板
"showReuseMessage": true,//控制是否显示“终端将被任务重用, 按任意键关闭”提示.
"clear": false
}
}
launch.json需要将下图红框的位置修改成上面tasks.json指定生成的可执行文件exe文件的路径,程序调试需要找到该生成物的路径。
在src文件夹下新建一个test.c文件,测试程序如下:
//#include
#include
#include
#include
int main(int argc, char *argv[])
{
//rgb();
printf("读取bin文件结果:success\n");
//printf("long = %d,wide = %d\n",long,wide);
system("pause");
return 0;
}
打开当前test.c文件,按F5调试生成结果如下图红框中,仅编译当前test.c文件并输出test.exe文件到build目录下,shell输出正确。
这种方式仅作了解,并不实用;
两种方式:
1)将task.json文件改成下图红框所示,指定编译固定的.c文件,并输出指定的可执行文件到指定目录;
将#include
将#include
注意是include""而不是include<>
#include<>:编译器直接从系统类库目录里查找头文件:
#include"":默认从项目当前目录查找头文件,所谓项目当前目录,就是项目工程文件(*.vcxproj)所在的目录
1、#include<>一般用于包含系统头文件,诸如stdlib.h、stdio.h、iostream等;
2、#include""一般用于包含自定义头文件,比如我们自定义的test.h、declare.h等。
直接在项目当前目录使用相对路径查找头文件,则去掉上方c_cpp_properties.json文件中,添加的includePath指路径也可以,留着也不影响;
2)也可以将头文件修改成以下
将#include
将#include
关键是要让编译的.c文件能够查找到该头文件的位置。
输出结果如下红框,可以看到src文件夹下的test.c并没有编译进去,输出正确
在终端上输入命令gcc -g src/main.c src/rgb.c -o build/total.exe
将前两者联合编译为可调式文件total.exe放在build文件夹下;
编译的路径是在项目工程路径下,所以编译main.c的地址是src/main.c
.\build\total执行可执行文件,可以看到下图终端上输出结果正确。
-g 可执行程序包含调试信息
-o 指定输出文件名
-c 只编译不链接
-I(i的大写):指定头文件路径(相对路径或觉得路径,建议相对路径)
-L :指定连接的动态库或者静态库路径(相对路径或觉得路径,建议相对路径)
-l(L的小写):指定需要链接的库的名字
(链接静态库libc.a:-lc 链接动态库libc.so : -lc 注意:-l后面直接添加库名省区“lib”和“.so”或“.a” )
问题:
问题1:-l(L的小写)链接的到底是动态库还是静态库
答案:如果链接路径下同时有 .so 和 .a 那优先链接 .so
问题2:如果路径下同时有静态库和动态库如何链接静态库
答案:使用显示链接, gcc -l:lib***.a (将静态库的名字显示写出来)
或者在 gcc 编译的时候 加入参数 -static -lXXX, 则可以添加路径下面的静态库。
有时会遇到终端上敲不了命令的情况:
1)新建终端
2)选择下图右下角红框默认配置文件
3)选择第一项command prompt即可(系统自带的命令行程序);
4)终端上敲回车就可以敲命令了
gcc -I -i -L -l 参数区别 / -l(静态库/动态库)_gcc -i_Kolde的博客-CSDN博客https://blog.csdn.net/abcdu1/article/details/86083295
VS Code 配置调试参数、launch.json 配置文件属性、task.json 变量替换、自动保存并格式化、空格和制表符、函数调用关系、文件搜索和全局搜索、_vscode launch.json_wohu007的博客-CSDN博客https://blog.csdn.net/wohu1104/article/details/111464778VSCode配置终端为cmd命令行程序的操作步骤_vscode配置cmd终端_Seekladoom的博客-CSDN博客https://blog.csdn.net/Seekladoom/article/details/124004221Vscode C语言实现多文件编译 - 知乎背景:很多大项目都是一人负责一个模块,在实际应用中不可能每个人都打开同一个main.c文件写自己的模块,因此会出现将函数在一个自定义的.h文件中声明,在一个.c文件中定义,并在main.c中调用的情况。此时将这个自…https://zhuanlan.zhihu.com/p/624788168Windows下用VScode编写C++程序如何添加并应用自定义头文件_Penguuuuiiiiiiin的博客-CSDN博客Windows下用VScode编写C++程序如何添加并应用自定义头文件关键词:Windows,CPP,VScode,自定义头文件一个编程小白,正在试着用vscode学CPP,标准库应用没有问题,但自定义的头文件和自定义头文件中声明的函数用不了。刚刚被这个问题整个半死,花了一晚上终于解决了。整体如下main函数引用了一个include文件夹中自定义的.h文件,并在lib文件夹里有相应.cp...https://blog.csdn.net/Penguuuuiiiiiiin/article/details/104191496