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)
I want to put all my object file in a directory ./obj
. I want to create it if such a directory is not existing. What is wrong with if test ! -d $(ODIR); then mkdir $(ODIR); fi
? The error said
Assembler messages: Fatal error: can't create obj/: Is a directory
CodePudding user response:
The first problem is that DLL
isn't defined anywhere.
The second problem is here:
OBJ = $(patsubst %.cpp, %.o, $(SRCS))
See the space after the first comma? It looks innocuous, but it means that the variable OBJ
winds up containing myfunc.o
, which also looks harmless, until you construct _OBJ
which turns out to be ./obj/ myfunc.o
, which trips up the compiler.
The third problem is that Make will execute the $(_OBJ)
rule before the $(DLL)
rule, so the compiler must use the obj/
directory before it exists.
The last problem (I hope) is that you seem to be passing $(CFLAGS)
as arguments to the archive-maintaining program, when you should use $(ARFLAGS)
(and make sure it actually contains what you intend).
CodePudding user response:
A final problem that isn't a problem yet but will be:
SRCS = myfunc.cpp
OBJ = $(patsubst %.cpp,%.o,$(SRCS))
_OBJ = $(ODIR)/$(OBJ)
As long as SRCS
only contains one file, this will be fine. But as soon as you add a second file, the above is wrong.
Suppose SRCS
contains myfunc.cpp myother.cpp
. Then OBJ
contains myfunc.o myother.o
. Then _OBJ
, which is $(ODIR)/$(OBJ)
, will be ./obj/myfunc.o myother.o
which is not what you want.
Better is to just write it as a single change:
SRCS = myfunc.cpp
_OBJ = $(patsubst %.cpp,$(ODIR)/%.o,$(SRCS))