所以我有一个必须在不同机器上编译的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)/$@
答案 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 $@