Right way to use VPATH/vpath?

随声附和 提交于 2021-02-10 16:20:30

问题


I am trying to use my Makefile (Make for Windows) by adding source paths to vpath/VPATH. This seems trivial but for some reason I am unable to get it to work

My directory structure is like this:

├── Makefile
├── out\
└── src\
    └── hello.cpp

My Makefile is:

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 $<

changing to vpath didn't help me. I seem to have something fundamentally wrong here. The error I see is:

make: *** No rule to make target `out\hello.o', needed by `out\app'.  Stop.   

EDIT: debug output from 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'.

回答1:


As MadScientist points out you should avoid backslashes as they have odd results like this, had you used forward slashes throughout your Makefile you wouldn't have had this issue, that said it is possible to work around them.

There are a few things wrong here:

  • You haven't posted the same Makefile you're using again, the first rule after all should have $(TGT)\app.exe as a target.
  • A backslash before % in a pattern rule will turn it into a literal %, escape the backslash
  • You forgot to tell gcc where to output the object file

Once you've fixed all of this you should find vpath works as expected, the complete fixed Makefile is

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 $@


来源:https://stackoverflow.com/questions/49240736/right-way-to-use-vpath-vpath

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!