如何在Makefile中正确使用变量?

3
我在跟随一个创建简单乒乓球游戏的教程,并想尝试使用makefile。我进行了一些研究并写了一个,但我无法使其正常工作。
这是我的项目文件夹的样子。
project/
|__include/
|  |__*.h
|__release/
|  |__obj/
|  |__Makefile
|__src/
   |__*.cpp

这是我的Makefile文件:
CXX         :=  g++

# Directories
SDIR        :=  ../src
IDIR        :=  ../include
ODIR        :=  ./obj
VPATH       :=  $(SDIR)

# Files
_SRCS       :=  stdafx.cpp Pang.cpp Game.cpp MainMenu.cpp SplashScreen.cpp
SRCS        :=  $(patsubst %,$(SDIR)/%,$(_SRCS))
_DEPS       :=  stdafx.h Game.h MainMenu.h SplashScreen.h
DEPS        :=  $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJS       :=  $(_SRCS:.cpp=.o)
OBJS        :=  $(patsubst %,$(ODIR)/%,$(_OBJS))
EXES        :=  Pang

# Parameters
CXXFLAGS    :=  -O2 -g -Wall -fmessage-length=0
LIBS        :=  -lsfml-audio -lsfml-graphics -lsfml-window -lsfml-system

# Default rule
all: $(SRCS) $(EXES)

# Generic compilation rule
$(ODIR)%.o : %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

# Link object files
$(EXES): $(OBJS)
    $(CXX) $(CXXFLAGS) -o $@ $^ $(LIBS)

# Clean Rule
clean:
    rm -f $(ODIR)/*.o $(EXES)

当我运行make命令时,会得到以下输出:
make all 
make: *** No rule to make target `obj/stdafx.o', needed by `Pang'.  Stop.

SFML 之前好像是正常工作的,所以我想它不是问题所在。
任何帮助都将是非常棒的!

我建议您使用 remake -x 来调试您的 makefile 问题。您也可以使用更好的构建工具,例如 http://omake.metaprl.org/。 - Basile Starynkevitch
@BasileStarynkevitch:又一个构建系统?而且这个还需要整个OCaml,好主意! - Michał Górny
1
你有stdafx.cpp文件吗? - Michał Górny
1
@engrato: include?它应该在src内遵循这些规则(注意.cpp而不是.h)。 - Michał Górny
@g-makulik:路径分隔符确实是问题所在。谢谢! - engrato
显示剩余9条评论
1个回答

4

this:

$(ODIR)%.o : %.cpp

should be:

$(ODIR)/%.o : %.cpp

(请注意斜杠)

第一个规则期望创建像./objstdafx.o这样的文件。第二个规则期望创建像./obj/stdafx.o这样的文件。因此,使用第一个规则时,make不知道如何构建obj/stdafx.o

有关模式匹配规则的更多信息,请参见文档


可以了,谢谢!我还得在 CXXFLAGS 中添加 -I$(IDIR) - engrato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接