为什么我不能在 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))
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))