主要补了一下C++编译连接的知识,顺带着学习了一下VS code编写C++的环境配置问题,详细学习了几个json文件的作用
之前学习C++语法的时候一直用的visual studio,奈何到ubuntu下没有visual studio,于是下载了VS code,菜鸡是不会用Vim的 0.0
本来以为VS code和visual studio一样,我新建cpp文件写个代码就能运行,结果发现并!不!是!这!样!百度了一下VS code写C++需要配置环境,好吧那就配置,按照网上的做法先下载g++和gdb,虽然不知道是干啥的,ok让我下我就下吧。下载完后装好在C++插件,然后创建tasks.json和launch.json两个配置文件,这块就有问题了:这俩配置文件是干啥的?里面的参数代表啥意思?为啥我按照博主教的方法写了一模一样的配置,我这里就运行报错呢!!!
好吧我是真的没在网上找到有用的信息,所有的博客清一色,“按照我这样配置就行了,不用问为什么,是什么。。。。”我晕!浪费了好多时间,最后看官方文档,真香!
回到正题,首先要知道C++编译连接的机制:
首先我们目录如下:
—project1
——include
————func.h
——src
————func.cpp
——main.cpp
细节网上一大堆,这里注意两点就行
- 编译时对每个cpp文件进行单独编译,同时要用-I 标记头文件目录
g++ -c main.cpp src/func.cpp -I include/
- 只将编译cpp文件生成的.o文件链接起来
g++ func.o main.o
OK有了这点知识,首先配置我们的tasks.json文件,这个文件实际上就是用来控制c++编译链接过程的,这里面注意要根据我们项目的实际情况来修改tasks.json文件,看下面的代码,args就是我们通常使用g++ 编译链接cpp文件时后面跟的控制指令
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-g",
"${workspaceFolder}/src/*.cpp", //头文件实现的cpp文件
"${workspaceFolder}/*.cpp",// main.cpp
"-I",
"${workspaceFolder}/include", // 头文件路径
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compiler: /usr/bin/g++"
}
]
}
这里面 -g 表示启用gdb调试,-I如前所述定位头文件位置,"${workspaceFolder}/src/*.cpp","${workspaceFolder}/*.cpp"
这个表示我们的所有cpp文件名称。
其中workspaceFolder是指工作文件夹,也就是home/xx/VSCODE/project1/,关于此类运行时变量,参考官方文档。例如fileBasenameNoExtension,当我们打开哪个文件时,他就是哪个文件的名称,所以不要在json文件页面中按ctrl+shift+b编译,这样会生成一个名字为json的可执行文件。。。
说完了tasks.json,接着说一下VSCODE include path的问题,当我们需要引入头文件时,我们需要将自己写的头文件的路径加入include path中,具体做法是创建c_cpp_properties.json文件,将头文件路径加入includePath中:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/include" //这里是我自己的头文件路径
],
"defines": [],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
最后,如果我们还想要调试c++代码,此时需要创建launch.json,系统默认生成的json我们是不需要修改的,这里注意,launch.json文件就是指定我们要调试的对象,我们最后编译链接的结果是main这个文件,因此我们就是针对它进行调试,在launch.json中"program": "${fileDirname}/${fileBasenameNoExtension}",
program就是指定了这个文件。当我们在main.cpp文件页面按下f5,那么运行时变量{fileDirname}就是project1/,{fileBasenameNoExtension}就是main,这样就定位了要调试的文件。
还有一点要注意:"preLaunchTask": "g++ build active file",
preLaunchTask后的参数要和tasks.json中的label参数一致,这样在我们改完代码后,f5调试时才能自动调用tasks.json文件对新代码编译链接生成新的可执行文件,再进行调试。
附上launch.json文件:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++ - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",//要调试的可执行文件
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "g++ build active file", //这里和tasks.json中label参数一致
"miDebuggerPath": "/usr/bin/gdb"
}
]
}