如题,尝试很多方法无法成功解决,最终把改成一坨的launch.json和task.json(附vscode 打开 task.json的方法vscode `打开tasks.json的方法)丢给DS。
1. tasks.json 的问题
我的代码
task.json:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "compile",
"command": "D:/TDM-GCC-64/bin/gcc.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
""
],
"options": {
"cwd": "D:/TDM-GCC-64/bin"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: D:/TDM-GCC-64/bin/gcc.exe"
}
]
}
DS的回复:
问题 1:args 中的空字符串
-
在 args 数组中,最后一个元素是空字符串 “”,这可能会导致编译命令无效。
- 解决方法:删除空字符串。
问题 2:options.cwd 的设置
你将 cwd 设置为 D:/TDM-GCC-64/bin
,这意味着编译命令会在该目录下运行。
如果你的源代码不在这个目录下,可能会导致找不到文件。
- 解决方法:将 cwd 设置为
${fileDirname}
或${workspaceFolder}
,以确保编译命令在正确的目录下运行。
问题 3:路径分隔符
在 Windows 上,路径分隔符可以是 / 或 \。为了跨平台兼容性,建议使用 /。
修改后的 tasks.json
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "compile",
"command": "D:/TDM-GCC-64/bin/gcc.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}" // 设置为当前文件目录
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: D:/TDM-GCC-64/bin/gcc.exe"
}
]
}
2. launch.json 的问题
我的代码
launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++ Runner: Debug Session",
"type": "cppdbg",
"request": "launch",
"args": [],
"stopAtEntry": false,
"externalConsole": true,
"cwd": "d:/aThreeDown/cryptology/hw3",
"program": "{fileDirname}\\${fileBasenameNoExtension}",
"MIMode": "gdb",
"miDebuggerPath": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
DS的回复:
问题 1:program 路径错误
你的 program 字段写的是 {fileDirname}\\${fileBasenameNoExtension}
,但 {fileDirname}
缺少 $
符号。
- 解决方法:将
{fileDirname}
改为${fileDirname}
。
问题 2:program 路径缺少 .exe 扩展名
在 Windows 上,可执行文件通常需要 .exe 扩展名。
- 解决方法:将 program 改为
${fileDirname}/${fileBasenameNoExtension}.exe
。
问题 3:miDebuggerPath 的设置
你直接将 miDebuggerPath 设置为 gdb,这要求 gdb 在系统的环境变量中。
如果 gdb 不在环境变量中,调试器会找不到。
- 解决方法:指定 gdb 的完整路径,例如
D:/TDM-GCC-64/bin/gdb.exe
。
问题 4:cwd 的设置
你将 cwd 设置为 d:/aThreeDown/cryptology/hw3
,这是一个硬编码路径。
如果项目路径变化,会导致调试失败。
- 解决方法:将 cwd 设置为
${fileDirname}
或${workspaceFolder}
。
修改后的 launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++ Runner: Debug Session",
"type": "cppdbg",
"request": "launch",
"args": [],
"stopAtEntry": false,
"externalConsole": true,
"cwd": "${fileDirname}", // 设置为当前文件目录
"program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 添加 .exe 扩展名
"MIMode": "gdb",
"miDebuggerPath": "D:/TDM-GCC-64/bin/gdb.exe", // 指定 gdb 的完整路径
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "compile" // 添加 preLaunchTask,确保调试前运行编译任务
}
]
}
我的总结
- cwd 是 Current Working Directory(当前工作目录)的缩写,表示命令运行的目录。在 VSCode 的 tasks.json 和 launch.json 中,cwd 用于指定任务或调试器运行时的当前工作目录。
${fileDirname}
是 VSCode 的预定义变量,表示当前打开文件的目录路径。在我原本的配置文件中,有好几处关于cwd的地址错误,漏掉$符号和将地址写死都是不对的- program后面的参数代表可运行文件,在windows中要加后缀名.exe,我参考的有些博客可能由于在linux上运行而不加。
- args如果确实没有参数应该写
"args": []
。 - task.json里面label的值是我照着网上的博客抄的,现在看起来好像没什么问题,以后不知道会不会有问题。label 是 tasks.json 中每个任务的必填字段。如果删除 label,VSCode 会报错,任务将无法运行。每个任务的 label 必须是唯一的,不能重复