• 40 VSCode下.json文件的编写——(1) linux/g++ (2).json中参数与预定义变量的意义解释


    0 引言

    转入linux/VSCode编程之后,迫切了解到有必有较为系统地学习一下VSCode中相关配置文件的写法。下面将分为 linux/g++编译指令、.json文件关键词/替换变量的意义、编译链接过程原理分析几个部分进行介绍,并以opencv为例,将上述知识综合运用。

    1 linux/g++编译指令介绍

    参照BattleScars的博客,摘取其中对本文有用的部分进行运用,博客链接如下,质量非常之高,表示感谢!!!

    https://www.cnblogs.com/battlescars/p/cpp_linux_gcc.html

    (1)针对一个完整的、单一的.cpp文件,helloworld.cpp,其编译指令如下。

    $ g++ helloworld.cpp

    编译器 g++ 通过检查命令行中指定的文件的后缀名可识别其为 C++ 源代码文件。编译器默认的动作:编译源代码文件生成对象文件(object file),链接对象文件和c++ 库中的函数得到可执行程序。然后删除对象文件。由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。程序的运行方式如下,

    $ ./a.out 

    如果要指定可执行程序的文件名,使用 "-o"参数,如下,

    $ g++ -std=c++11 helloworld.cpp -o helloworld

    暂时了解到这里就可以了,在编译多个源文件生成可执行程序时,可参照上述博客内容。

    (2)g++相关参数的意义

      参考了此贴,表达感谢!

    https://blog.csdn.net/lin_008/article/details/77600483

      1  g++ -I[path](大写的i,即include path) 编译程序按照指定的路径去搜索头文件,指定的路径为第一个去寻找的路径,eg

    g++ -I/usr/include

      2  g++ -L[lib](大写的L)  编译程序按照-L指定的路径进去寻找文件,一般的在-L的后面可以一次用-l指定多个库文件 ,eg

    g++ -L/usr/lib/x86_64-linux-gnu

      3 g++ -l  [掐头去尾的库名](小写L) 编译程序到系统默认路径寻找库文件,库文件的格式如下。

    g++ -lz     #库文件的名称为libz.so,库名为z

      如果找不到,那么到当前目录下找;如果还找不到,那么到LD_LIBRARY_PATH等环境变量置顶的路径中去查找;如果仍然找不到,那么编译程序提示找不到库。 

    2 .json文件参数的意义

    VSCode采用.json结尾的文件作为配置文件,包含关键词和相关参数两个部分。以本人编写的opencv中的参数文件为例进行解释,如下。

    (1)launch.json

    参考了VSCode官网上的两个帖子,链接如下。

    https://code.visualstudio.com/docs/languages/cpp                                  # c++编程环境配置
    https://code.visualstudio.com/docs/editor/debugging#_launch-configurations        #详细解释了launch.json中的参数的含义

    为了能够debugging,需要生成一个launch.json文件,Linux下VSCode支持的的调试器为GDB,配置时点击configure按钮并选择 c++(GDB/LLDB),即可创建一个launch.json文件.

    其中,preLauchTask可将launch.json和tasks.json文件关联起来,用于在调试前完成build任务。

    {
        // 使用 IntelliSense 了解相关属性。 
        // 悬停以查看现有属性的描述。
        // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "(gdb) Launch",              //  强制:就一个名字而已,但是是必须要有的
                "type": "cppdbg",                    //  强制:调试器的类型,Node debugger for  node, php for PHP , go for GO           
                "request": "launch",                 //  强制:launch/attach
                "program": "${workspaceFolder}/${fileBasenameNoExtension}.out", // 可执行文件的路径
                "miDebuggerPath": "/usr/bin/gdb",    //  调试器的位置
                "preLaunchTask":"build",             //  调试前编译任务名称
                "args": [],                          //  调试参数
                "stopAtEntry": false,
                "cwd": "${workspaceFolder}",         //  当前工作目录
                "environment": [],                   //  当前项目环境变量
                "externalConsole": true,
                "MIMode": "gdb",                     //  调试器模式/类型
                "setupCommands": [
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    }
                ]
            }
        ]
    }

    (2)tasks.json

    参考了VSCode的两个文档,链接如下。

    https://code.visualstudio.com/docs/languages/cpp            # c++配置环境中的例子
    https://code.visualstudio.com/docs/editor/tasks#vscode      # 专门介绍tasks.json的

    想从VSCode中构建应用程序,必须要生成一个tasks.json文件。生成时,需要指定编译器为"g++",并在args[]中编写 g++编译指令.

    {
        // See https://go.microsoft.com/fwlink/?LinkId=733558
        // for the documentation about the tasks.json format
        "version": "2.0.0",   
        "tasks":[  // 可以有多个任务
            {
                "label": "build",       // 编译任务名
                "type": "shell",        // 编译任务的类型,通常为shell/process类型
                "command": "g++",       // 编译命令
                "args":[
                    "-g",               // 该参数使编译器在编译的时候产生调试信息
                    "${workspaceFolder}/${fileBasename}",    // 被编译文件,通常为.cpp/.c/.cc文件等
                    "-I",                                    // include path指令
                    "/usr/include",                          
                    "-L",                                    // lib路径
                    "/usr/lib/x86_64-linux-gnu",             
                    "-l",                                    // 链接库文件1
                    "opencv_core",                           
                    "-l",                                    // 链接库文件2
                    "opencv_highgui",                        
                    "-o",                                    // 生成指定名称的可执行文件
                    "${workspaceFolder}/${fileBasenameNoExtension}.out"  
              /* -g hello.cpp -I/usr/include -L/usr/lib/x86_64-linux-gnu -lopencv_core -o hello.out */ ],
    "group": { "kind": "build", "isDefault": true } }, { "label": "cmakebuild", "type": "shell", "command": "cd build && cmake ../ && make", // shell 编译命令,做并运算,即前一命令执行失败,则后一命令也不执行 "args": [] } ] }

    (3)预定义变量的意义解释

    参考了该贴,表示感谢。

    https://blog.csdn.net/bat67/article/details/78302871?locationNum=4&fps=1
    ${workspaceFolder} :表示当前workspace文件夹路径,如C:UsersadminDesktop	est
    ${workspaceRootFolderName}:表示workspace的文件夹名,如test
    ${file}:文件自身的绝对路径,如C:UsersadminDesktop	est.vscodelaunch.json
    ${relativeFile}:文件在workspace中的路径,如.vscodelaunch.json
    ${fileBasenameNoExtension}:当前文件的文件名,不带后缀,如hello/launch
    ${fileBasename}:当前文件的文件名,如 hello.cpp/launch.json等
    ${fileDirname}:文件所在的文件夹路径,也即C:UsersadminDesktop	est.vscode
    ${fileExtname}:当前文件的后缀,也即.json
    ${lineNumber}:当前文件光标所在的行号
    ${env:PATH}:系统中的环境变量
  • 相关阅读:
    产品经理的十宗罪,你犯了几宗?
    产品经理的10大顾虑
    【FastAPI 学习 七】GET和POST请求参数接收以及验证
    【FastAPI 学习 六】异常处理
    【FastAPI 学习 五】统一响应json数据格式
    前端展示(三)
    前端展示(二)
    前端设计(一)
    后端流程分析
    生成词云图
  • 原文地址:https://www.cnblogs.com/ghjnwk/p/10415294.html
Copyright © 2020-2023  润新知