返回

VS Code 编译路径自动添加引号:如何诊断和解决?

Linux

VS Code 编译路径自动添加引号:问题诊断与解决方案

问题

在使用 VS Code 设置 C++ 项目的编译任务时,你可能遇到一个奇怪的现象,即 VS Code 会在编译路径中自动添加引号,即使你没有在配置中指定这样做。这会导致编译失败,并显示类似于以下内容的错误消息:

/usr/bin/g++ -fdiagnostics-color=always -g -std=c++20 '/home/stoner69/codes/C++20TemplateProject/*.cpp' -o /home/stoner69/codes/C++20TemplateProject/.vscode/rooster
cc1plus: fatal error: /home/stoner69/codes/C++20TemplateProject/*.cpp: No such file or directory
compilation terminated.

这种问题让人摸不着头脑,但实际上背后的原因非常简单。

罪魁祸首:"Shell Expansion"

问题的根源在于 VS Code 使用的一个称为 "shell expansion" 的功能。此功能将编译路径中的某些特殊字符(例如星号 "*" 和双星号 "**")解释为 shell 通配符。当 VS Code 检测到这些字符时,它会在它们周围添加引号,以防止 shell 将它们解释为通配符。

在这种情况下,使用了星号("*")来匹配工作空间文件夹中的所有 ".cpp" 文件。但是,当 VS Code 添加引号时,星号将被解释为一个字面字符串,而不是一个通配符。这会导致编译器找不到匹配的文件,并引发错误。

解决方案:禁用 "Shell Expansion"

要解决这个问题,我们需要禁用 VS Code 的 "shell expansion" 功能。有两种方法可以做到这一点:

方法 1:编辑 tasks.json 文件

在 tasks.json 文件中,找到引起问题的任务(在本例中为 "Build with G++" 任务)。然后,在 "args" 数组中,将引起问题的参数(包含星号或双星号的参数)用引号括起来。

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "Build with G++",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "-std=c++20",
                "\"${workspaceFolder}/*.cpp\"",
                "-o",
                "\"${fileDirname}/rooster\""
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "compiler: /usr/bin/g++"
        }
    ]
}

方法 2:使用转义序列

在 tasks.json 文件中,可以使用转义序列来防止 VS Code 将星号或双星号解释为通配符。要做到这一点,在星号或双星号之前添加反斜杠(\)。

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "Build with G++",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "-std=c++20",
                "${workspaceFolder}/\\*.cpp",
                "-o",
                "${fileDirname}/rooster"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "compiler: /usr/bin/g++"
        }
    ]
}

通过使用上述解决方案之一,你应该能够禁用 VS Code 的 "shell expansion" 功能,并解决编译路径中自动添加引号的问题。

常见问题解答

Q1:为什么 VS Code 会添加引号?

A1:VS Code 会在编译路径中的特殊字符(例如星号和双星号)周围添加引号,以防止 shell 将它们解释为通配符。

Q2:如何禁用 "shell expansion"?

A2:有两种方法可以禁用 "shell expansion":编辑 tasks.json 文件或使用转义序列。

Q3:我可以对 tasks.json 文件中的哪些参数使用转义序列?

A3:你可以在包含星号或双星号的任何参数中使用转义序列。

Q4:除了 "shell expansion" 之外,还有什么其他可能导致编译失败?

A4:编译失败的其他可能原因包括:拼写错误、路径错误、缺少依赖项和版本冲突。

Q5:我该怎么做才能避免此类问题?

A5:为了避免此类问题,请确保:使用正确的路径、安装所有必需的依赖项、检查拼写错误,并在更新时检查版本兼容性。