前言
最近一直在使用vscode编写C/C++,除去偶尔写一些单个文件的代码,更多时候需要写多文件的编程,甚至有时候编译代码需要链接库。
编译项目通常可以使用终端,但是使用终端每次都要写一串很长的命令,不如使用vscode编译来的便捷。但是,vscode的编译虽然不难也是需要掌握一些知识才能顺利编译成功,并且进行后续调试代码。
准备工作
在多文件编译调试之前,我们得先写好多个文件,并且有的文件存在调用关系。



上面几个文件的关系如下:

主要步骤
在进行调试和编译之前我们需要明白:
1,task.json是vscode中用于定义任务的配置文件,它实际上是终端命令的一个代替,它实现的效果和你在终端敲命令的效果是一样的,在vscode操作是更加便捷的。
2,调试是在编译成功的基础之上进行的,只有编译生成的可执行文件才能进行调试。
编译
1,点击终端
2,选择配置任务
3,因为是c++项目,选择g++生成活动文件


vscode会生成一个task.json文件,在task.json文件中自动生成下面内容:
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: /usr/bin/g++"
}
]
生成的这个任务配置对于单个文件的执行是没有问题的,但是对于多文件这样的写法是不能够链接其他文件,于是参照网上写法把task.json文件改为:
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"\"${workspaceFolder}\"/chat_client.cpp",
"\"${workspaceFolder}\"/kcp_client.cpp",
"\"${workspaceFolder}\"/kcp_session.cpp",
"\"${workspaceFolder}\"/udp_socket.cpp",
"\"${workspaceFolder}\"/*.c",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-lpthread"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: /usr/bin/g++"
}
]
这个改动版本有几个需要注意的点:
1,KaTeX parse error: Expected group as argument to '\"' at end of input: …隔符; 2,为什么没有写成\"{workspaceFolder}"/*.cpp,是因为我的文件中除了chat_client.cpp还有chat_server.cpp,它们都存在main函数,以及ikcp.c中的函数被他们多次的编译和连接;
3,因为我的代码使用了线程库,在终端编译时需要加-lpthread,所以这里也在任务配置中添加了。
调试
1,点击运行
2,选择启动调试
3,如果会弹出选择环境,选择GDB调试,可能因为我以前选过就不在弹出

在.vscode文件夹中,能明显看到调试生成的文件launch.json

在里面的内容大致如下:
"configurations": [
{
"name": "C/C++: g++ 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": ["192.168.80.128","8002"],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ 生成活动文件",
"miDebuggerPath": "/usr/bin/gdb"
}
]
在这里我做了两处修改:
1,要想正确运行编译好的程序需要输入ip和端口,所以我在args参数中输入了ip和端口的值;
2,在后续调试的过程中,需要输入内容,所以我把externalConsole的值调为true,这样调试时程序会在外部中断运行,可以方便接收输入。

2327

被折叠的 条评论
为什么被折叠?



