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

所属分类: 软件编程 / C 语言 阅读数: 124
收藏 0 赞 0 分享

0 引言

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

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

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

https://www.jb51.net/article/183540.htm

(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://www.jb51.net/article/183542.htm

  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://www.jb51.net/article/183162.htm

${workspaceFolder} :表示当前workspace文件夹路径,如C:\Users\admin\Desktop\test
${workspaceRootFolderName}:表示workspace的文件夹名,如test
${file}:文件自身的绝对路径,如C:\Users\admin\Desktop\test\.vscode\launch.json
${relativeFile}:文件在workspace中的路径,如.vscode\launch.json
${fileBasenameNoExtension}:当前文件的文件名,不带后缀,如hello/launch
${fileBasename}:当前文件的文件名,如 hello.cpp/launch.json等
${fileDirname}:文件所在的文件夹路径,也即C:\Users\admin\Desktop\test\.vscode
${fileExtname}:当前文件的后缀,也即.json
${lineNumber}:当前文件光标所在的行号
${env:PATH}:系统中的环境变量
更多精彩内容其他人还在看

用标准c++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

C++类的静态成员初始化详细讲解

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多