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

Makefile 移动需要链接到特定子文件夹的对象文件,makefile,gnu-make,Makefile,Gnu Make,所以我有一个makefile,它必须在不同的机器上编译(solaris和unix),所以我们需要为我们的目标文件创建不同的目录来进行创建。我遇到了麻烦,因为我不能完全理解创建特定对象文件的语法,因为make不允许我使用-c链接。这里是我到目前为止尝试创建不同目录的一个片段,程序应该将.o文件放在不同的目录中,并引用它们在同一目录中构建库 OBJDIR = objdir OBJ = $($(OBJDIR)/$(OSDEF)) $(OBJDIR): mkdir $(OBJDIR) \ mkdir

所以我有一个makefile,它必须在不同的机器上编译(solaris和unix),所以我们需要为我们的目标文件创建不同的目录来进行创建。我遇到了麻烦,因为我不能完全理解创建特定对象文件的语法,因为make不允许我使用-c链接。这里是我到目前为止尝试创建不同目录的一个片段,程序应该将.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)/$@

所有多行规则都缺少一个
在shell命令之间

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

为什么你没有一个库的目标,为什么你要在一个地方创建库,然后移动它,而不是仅仅在正确的地方创建它

$(OBJ)/libList.a: $(OBJ)
    ar -crvs $@ $(OBJ)/list_adders.o $(OBJ)/list_movers.o $(OBJ)/list_removers.o
您的makefile规则声称创建
list\u xxx.o
,但实际上创建了
$(OBJ)/list\u xxx.o
,这只会让make感到困惑。不要那样做。目标应该是
$(OBJ)/list\u xxx.o

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

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

谢谢你的帮助!在这里我确实做到了,现在我只是想弄清楚mkdir命令的含义!第二个$(OBJ)命令在分号之间只有空格,这让我有点困惑。这是打字错误还是有不同的语法?我对makefiles还是相当陌生的,所以非常感谢所有这些帮助!另外,我还有一个问题;如果有人想从make运行libList,那该怎么做呢?我试着像那样运行,我假设我必须指定目录,比如
makeodjdir/Linux/libList.a
?那里的空白被忽略,这没有什么区别。是的,这就是创建库的方法,或者您可以添加依赖于库的目标(例如
libList:$(OBJ)/libList.a
),这样您就可以说
makeliblist
$(OBJ)/list_removers.o: list.h list_removers.c $(OBJ)
    $(CC) $(CCFLAGS) -c list_removers.c -I. -o $@