为什么我不能在 makefile 中创建目录?

Why I cannot create directory in makefile?

ODIR =./obj

SRCS = myfunc.cpp
DEPS = header.h

OBJ = $(patsubst %.cpp, %.o, $(SRCS))
_OBJ = $(ODIR)/$(OBJ)

$(DLL): $(_OBJ)
    if test ! -d $(ODIR); then mkdir $(ODIR); fi
    $(AR) $(CFLAGS) -o $@ $^ 

$(_OBJ): $(SRCS) $(DEPS)
    $(CC) -c -o $@ $< $(INCL) $(LDFLAGS)

我想将所有目标文件放在一个目录 ./obj 中。如果这样的目录不存在,我想创建它。 if test ! -d $(ODIR); then mkdir $(ODIR); fi 有什么问题?错误说

Assembler messages: Fatal error: can't create obj/: Is a directory

第一个问题是 DLL 没有在任何地方定义。

第二个问题在这里:

OBJ = $(patsubst %.cpp, %.o, $(SRCS))

看到第一个逗号后的 space 了吗?它看起来无害,但这意味着变量 OBJ 最终包含 myfunc.o,这看起来也无害,直到您构造 _OBJ 结果是 ./obj/ myfunc.o,它会跳闸启动编译器。

第三个问题是Make会在$(DLL)规则之前执行$(_OBJ)规则,所以编译器必须使用obj/目录才存在

最后一个问题(我希望)是你似乎将 $(CFLAGS) 作为参数传递给 archive-maintaining 程序,而你应该使用 $(ARFLAGS)(并确保它实际上包含您想要的内容)。

最后一个问题还不是问题,但会是:

SRCS = myfunc.cpp
OBJ = $(patsubst %.cpp,%.o,$(SRCS))
_OBJ = $(ODIR)/$(OBJ)

只要SRCS只包含一个文件就可以了。但是一添加第二个文件,上面的就错了

假设 SRCS 包含 myfunc.cpp myother.cpp。那么 OBJ 包含 myfunc.o myother.o。然后 _OBJ,即 $(ODIR)/$(OBJ),将是 ./obj/myfunc.o myother.o,这不是您想要的。

更好的做法是将它写成一个单一的变化:

SRCS = myfunc.cpp
_OBJ = $(patsubst %.cpp,$(ODIR)/%.o,$(SRCS))