Makefile对象列表和对象位置

时间:2014-01-01 03:59:11

标签: makefile

我使用这些变量和目标将目标文件编译到特定位置:

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/中,所以配方找不到它们。

如何定义一次目标文件列表,并在配方中使用它们?

2 个答案:

答案 0 :(得分:4)

1)Make可以操纵字符串:

FOOOBJECTS=foo.o foo1.o foo2.o
BAROBJECTS=bar.o bar1.o

OBJECTS = $(addprefix $(OBJDIR)/, $(FOOOBJECTS) $(BAROBJECTS))

2)自动变量是你的朋友(我认为你希望你的可执行文件包含main.o,而不仅仅是foobar对象):

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