移动需要链接到特定子文件夹的对象文件

时间:2014-10-29 19:22:25

标签: makefile gnu-make

所以我有一个必须在不同机器上编译的makefile(solaris和unix),因此我们需要为我们的目标文件创建不同的目录以供创建。我碰到了墙,因为我无法理解创建特定目标文件的语法,使用-c链接,因为make不允许我这样做。这是我到目前为止尝试创建程序应该放置.o文件的不同目录,并引用它们在同一目录中构建库的一小部分。

OBJDIR = objdir
OBJ = $($(OBJDIR)/$(OSDEF))

$(OBJDIR):
mkdir $(OBJDIR) \
mkdir $(OBJDIR)/sun4sol \
mkdir $(OBJDIR)/Linux

OSDEF是sun4sol或linux。

libListCreation: list_adders.o list_movers.o list_removers.o
ar -crvs libList.a $(OBJ)/list_adders.o $(OBJ)/list_movers.o $(OBJ)/list_removers.o \
mv libList.a $(OBJ)/

list_removers.o: list.h list_removers.c
$(CC) $(CCFLAGS) -c list.h list_removers.c -I. -o $(OBJ)/$@

list_movers.o: list.h list_movers.c
$(CC) $(CCFLAGS) -c list.h list_movers.c -I. -o $(OBJ)/$@

list_adders.o: list.h list_adders.c
$(CC) $(CCFLAGS) -c list.h list_adders.c -I. -o $(OBJ)/$@

1 个答案:

答案 0 :(得分:1)

所有多行规则都缺少shell命令之间的;

您可能应该有$(OBJ)目录的目标,而不是将其创建为$(OBJDIR)的副作用(通常,您不应为每个目标创建多个文件或目录)

$(OBJDIR):
    mkdir $(OBJDIR)

$(OBJ) : $(OBJDIR)
    mkdir $(OBJ)

为什么你没有图书馆的目标,为什么你在一个地方创建图书馆然后移动它,而不是仅仅在正确的位置创建图书馆?

$(OBJ)/libList.a: $(OBJ)
    ar -crvs $@ $(OBJ)/list_adders.o $(OBJ)/list_movers.o $(OBJ)/list_removers.o

您的makefile规则声称创建了list_xxx.o但实际上创建了$(OBJ)/list_xxx.o,这只会让make混淆。不要这样做。目标应为$(OBJ)/list_xxx.o

您正在尝试编译头文件,不要这样做。

$(OBJ)/list_removers.o: list.h list_removers.c $(OBJ)
    $(CC) $(CCFLAGS) -c list_removers.c -I. -o $@