Makefile 使用VPATH/VPATH的正确方法?

Makefile 使用VPATH/VPATH的正确方法?,makefile,gnu-make,Makefile,Gnu Make,我试图通过将源路径添加到vpath/vpath来使用Makefile()。这似乎微不足道,但由于某种原因,我无法让它工作 我的目录结构如下: ├── Makefile ├── out\ └── src\ └── hello.cpp 我的Makefile是: TGT=out OBJ=hello.o VPATH=src # vpath %.cpp src all: $(TGT)\app.exe $(TGT)\app : $(TGT)\$(OBJ) g++ $^ -o $@ $

我试图通过将源路径添加到vpath/vpath来使用Makefile()。这似乎微不足道,但由于某种原因,我无法让它工作

我的目录结构如下:

├── Makefile
├── out\
└── src\
    └── hello.cpp
我的Makefile是:

TGT=out
OBJ=hello.o
VPATH=src
# vpath %.cpp src

all: $(TGT)\app.exe

$(TGT)\app : $(TGT)\$(OBJ)
    g++ $^ -o $@

$(TGT)\%.o : %.cpp
    g++ -Wall -Wextra -Werror -c $<
编辑:调试来自
make-d的输出

Considering target file `all'.
 File `all' does not exist.
 No implicit rule found for `all'.
  Considering target file `out\app'.
   File `out\app' does not exist.
    Considering target file `out\hello.o'.
     File `out\hello.o' does not exist.
     Looking for an implicit rule for `out\hello.o'.
     Trying pattern rule with stem `hello'.
     Looking for a rule with intermediate file `out\hello.cpp'.
      Avoiding implicit rule recursion.
      Trying pattern rule with stem `hello.cpp'.
     No implicit rule found for `out\hello.o'.
     Finished prerequisites of target file `out\hello.o'.
    Must remake target `out\hello.o'.

正如MadScientist指出的,您应该避免反斜杠,因为它们会产生像这样奇怪的结果,如果您在整个Makefile中使用前斜杠,您就不会有这个问题,也就是说可以解决它们

这里有几件事不对:

  • 您尚未发布再次使用的相同Makefile,
    all
    之后的第一条规则应将
    $(TGT)\app.exe
    作为目标
  • 模式规则中
    %
    之前的反斜杠将把它转换为文本
    %
    ,并转义反斜杠
  • 您忘了告诉gcc在哪里输出对象文件
一旦您修复了所有这些,您应该会发现
vpath
按预期工作,完整的修复Makefile就完成了

TGT=out
OBJ=hello.o
vpath %.cpp src

all: $(TGT)\app.exe

$(TGT)\app.exe : $(TGT)\$(OBJ)
    g++ $^ -o $@

$(TGT)\\%.o : %.cpp
    g++ -Wall -Wextra -Werror -c $< -o $@
TGT=out
你好
vpath%.cpp src
全部:$(TGT)\app.exe
$(TGT)\app.exe:$(TGT)\$(OBJ)
g++$^-o$@
$(TGT)\\%.o:%.cpp
g++-Wall-Wextra-Werror-c$<-o$@

首先,在makefiles中应该始终使用前斜杠,而不是反斜杠,即使在Windows上也是如此。其次,您可以使用
make-d
选项获取make,告诉您为什么它决定它与您的规则不匹配。它很长,所以把它缩短成看起来很重要的部分。因此,看起来源文件已在out文件夹中开始搜索,而VPATH未启动。我不知道如何让它在
src
文件夹中查找源文件。我以为VPATH会解决这个问题。我创建了一个新的测试目录结构,并为它编写了Makefile。所以这个Makefile就是我实际使用的那个。但是你逃避反斜杠的方法确实是正确的。我想现在是时候替换所有的反斜杠了。来自unix的这个斜杠业务对我一点也不感兴趣。谢谢我的Makefile中有一组路径。就最佳实践而言,我是否应该用前斜杠取代所有的斜杠?@rookie我想是的,如果只是因为你不再需要记住逃避这些东西的话。大多数windows命令行操作都可以接受正向斜杠,但我能想到的唯一例外是
del
TGT=out
OBJ=hello.o
vpath %.cpp src

all: $(TGT)\app.exe

$(TGT)\app.exe : $(TGT)\$(OBJ)
    g++ $^ -o $@

$(TGT)\\%.o : %.cpp
    g++ -Wall -Wextra -Werror -c $< -o $@