VScode编译多文件执行与配置终端命令行

一、编译多文件执行

1、配置文件使多文件执行

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编译器下载好,环境变量添加完成后进行;


1.1 测试程序


下面编译一个测试程序:

打开vscode,在里面创建一个工程,工程下面分别创建以下几个文件夹“:build;src;inc;output;intput;doc”

build文件夹:用来存放编译好的可执行的.exe二进制文件

src文件夹:用来存放各个功能模块的源文件

inc文件夹:用来存放各个功能模块的头文件

output文件夹:用来存放输出文件

intput文件夹:用来存放输入文件

doc文件夹:用来存放项目工程的说明文档

好啦,来看看我们的工程长什么样!(仅是个人习惯,文件夹可以随自身习惯建立自己喜欢的)

VScode编译多文件执行与配置终端命令行_第1张图片

在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一个头文件里也可以。

1.2 修改配置文件

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文件夹的绝对路径

VScode编译多文件执行与配置终端命令行_第2张图片

 当然上图中修改方式并不好,加上新建项目头文件绝对路径,那么每建立一个项目就要加一个绝对路径过于繁琐,可以在下图红框中位置加上"${workspaceFolder}\\inc",表示该项目文件夹下的inc文件夹,是相对路径。

VScode编译多文件执行与配置终端命令行_第3张图片

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

VScode编译多文件执行与配置终端命令行_第4张图片

编译的修改方式有很多,比如改成

gcc -c ${workspaceFolder}\\src\\*.c -I ${workspaceFolder}\\inc 也可以编译,如下图

VScode编译多文件执行与配置终端命令行_第5张图片

 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相对应
        }
    ]
}

将下图红框中的位置改为需要输出的可执行文件的路径即可,调试使用的路径。

VScode编译多文件执行与配置终端命令行_第6张图片

 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可执行文件;终端上是编译命令;VScode编译多文件执行与配置终端命令行_第7张图片

2、配置文件仅当前打开的文件执行

2.1 配置文件

针对只编译当前打开的文件,setting.json和c_cpp_properties.json不需要动;

 将tasks.json修改成下图红框中的内容;

表示编译当前打开的文件在当前建立的项目的build文件夹下生成当前打开的文件名称的exe可执行文件。

依据自己的习惯对生成文件的路径和名称做调节:${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe

VScode编译多文件执行与配置终端命令行_第8张图片

{
   
    "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文件的路径,程序调试需要找到该生成物的路径。

VScode编译多文件执行与配置终端命令行_第9张图片

2.2 测试程序

在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输出正确。

VScode编译多文件执行与配置终端命令行_第10张图片

3、配置文件指定的多个文件执行

这种方式仅作了解,并不实用;

两种方式:

1)将task.json文件改成下图红框所示,指定编译固定的.c文件,并输出指定的可执行文件到指定目录;

VScode编译多文件执行与配置终端命令行_第11张图片

将#include头文件修改成#include"..\inc\sys.h"相当路径;

将#include头文件修改成#include"..\inc\rgb.h"相当路径;

注意是include""而不是include<>

#include<>:编译器直接从系统类库目录里查找头文件:

#include"":默认从项目当前目录查找头文件,所谓项目当前目录,就是项目工程文件(*.vcxproj)所在的目录

1、#include<>一般用于包含系统头文件,诸如stdlib.h、stdio.h、iostream等;

2、#include""一般用于包含自定义头文件,比如我们自定义的test.h、declare.h等。

直接在项目当前目录使用相对路径查找头文件,则去掉上方c_cpp_properties.json文件中,添加的includePath指路径也可以,留着也不影响;

VScode编译多文件执行与配置终端命令行_第12张图片

2)也可以将头文件修改成以下

将#include头文件修改成#include"D:\my_code\isp_pipline\inc\sys.h"绝对路径;

将#include头文件修改成#include"D:\my_code\isp_pipline\inc\rgb.h"绝对路径;

关键是要让编译的.c文件能够查找到该头文件的位置。

输出结果如下红框,可以看到src文件夹下的test.c并没有编译进去,输出正确

VScode编译多文件执行与配置终端命令行_第13张图片

4、手动编译执行

在终端上输入命令gcc -g src/main.c src/rgb.c -o build/total.exe

将前两者联合编译为可调式文件total.exe放在build文件夹下;

编译的路径是在项目工程路径下,所以编译main.c的地址是src/main.c

.\build\total执行可执行文件,可以看到下图终端上输出结果正确。

VScode编译多文件执行与配置终端命令行_第14张图片

-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)新建终端

VScode编译多文件执行与配置终端命令行_第15张图片

 2)选择下图右下角红框默认配置文件

VScode编译多文件执行与配置终端命令行_第16张图片

3)选择第一项command prompt即可(系统自带的命令行程序);

VScode编译多文件执行与配置终端命令行_第17张图片

 4)终端上敲回车就可以敲命令了

VScode编译多文件执行与配置终端命令行_第18张图片

参考文章:

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

你可能感兴趣的:(C语言,vscode,c语言)