尽管没有明确说明,但似乎你正在使用Windows并且使用Cygwin make。基本上,按照Johan的建议,下面是一个完整的`tasks.json`,它使用`cygpath -m`将正斜杠传递给`make`:
"最初的回答"
{
"version": "2.0.0",
"tasks": [
{
"label": "build hello world",
"type": "shell",
"command": "d:/cygwin64/bin/sh",
"args": [
"-c",
"make APPDIR=$(cygpath -m '${workspaceFolder}')"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
以下是一个示例Makefile
:
$(info APPDIR is "$(APPDIR)")
helloworld.exe: helloworld.cpp
g++ -g -Wall -std=c++11 -o $@ helloworld.cpp
当我按下 Ctrl+Shift+B 来调用这个任务时,在终端窗口中我看到了以下内容:
Original Answer
最初的回答
> Executing task in folder cpphello: d:/cygwin64/bin/sh -c "make APPDIR=$(cygpath -m 'D:\wrk\learn\vscode\cpphello')" <
APPDIR is "D:/wrk/learn/vscode/cpphello"
make: 'helloworld.exe' is up to date.
Terminal will be reused by tasks, press any key to close it.
这里使用
-m
(混合)开关来调用
cygpath
,以获得看似Windows路径但使用正斜杠的路径。
cygpath
还有其他选项,请参见
cygpath --help
。
这里有两个细节:
1. 我明确指定了
sh
的路径。这是因为我还在$PATH中安装了
git for Windows,并且它出现在我的Cygwin路径之前,所以vscode将使用那个
git
。但是git for Windows也有
sh.exe
,如果在这里使用它,
make
会因为Cygwin DLL错误而崩溃。
2. 我必须将默认的VSCode shell更改为
cmd.exe
,而默认值为
powershell.exe
。这里powershell的问题在于,当将参数传递给它时,VSCode使用单引号,而我的解决方案要求VSCode使用双引号,它与
cmd.exe
一起使用。要更改shell,请使用调色板中的“Terminal: Select Default Shell”命令(Ctrl+Shift+P)。
最后,我想指出,如果在您的情况下可以创建一个中间的
bash
shell脚本而不是直接调用
make
,则可以避免所有这些麻烦。
tasks.json
语言并不是非常强大,VSCode在Windows上知道如何调用的古怪shell(即
cmd.exe
和
powershell.exe
)会增加额外的复杂性和脆弱性。
cygpath
和sh
命令。我建议替换make APPDIR=xxx
为sh -c "make APPDIR=$(cygpath 'xxx')"
. 注意引号的使用! - Johan Boulé