我使用这些变量和目标将目标文件编译到特定位置:
OBJDIR=./obj
objdir:
$(MKDIR) $(OBJDIR)
%.o: %.cpp objdir
$(CXX) $(CXXFLAGS) -c $< -o $(OBJDIR)/$@
现在我的问题是,当涉及链接可执行文件时,我想使用变量来保存目标文件列表,例如:
FOOOBJECTS=foo.o foo1.o foo2.o
BAROBJECTS=bar.o bar1.o
mycrappyprogram: main.o $(FOOBOJECTS) $(BARBOJECTS)
$(CXX) $(FOOBJECTS) $(BAROBJECTS) -o $(BINDIR)/mycrappyprogram
当然我不能这样做,因为所有对象都在./obj/
中,所以配方找不到它们。
如何定义一次目标文件列表,并在配方中使用它们?
答案 0 :(得分:4)
1)Make可以操纵字符串:
FOOOBJECTS=foo.o foo1.o foo2.o
BAROBJECTS=bar.o bar1.o
OBJECTS = $(addprefix $(OBJDIR)/, $(FOOOBJECTS) $(BAROBJECTS))
2)自动变量是你的朋友(我认为你希望你的可执行文件包含main.o
,而不仅仅是foo
和bar
对象):
mycrappyprogram: main.o $(OBJECTS)
$(CXX) $^ -o $(BINDIR)/$@
3)(非PHONY)规则应该构建它将要构建的东西,否则你将遇到麻烦:
$(BINDIR)/mycrappyprogram: main.o $(OBJECTS)
$(CXX) $^ -o $@
$(OBJDIR)/%.o: %.cpp objdir
$(CXX) $(CXXFLAGS) -c $< -o $@
答案 1 :(得分:0)
您可以使用addprefix
。
FOO_DIR = ./obj/
FOO_OBJS_NAME = foo.o foo1.o foo2.o
FOO_OBJS = $(addprefix $(FOO_DIR), $(FOO_OBJS_NAME))