我将编译的所有目标文件转储到一个名为的单独目录中
objfiles
编译时我想检查目录objfiles是否存在 如果它不存在(表示整个项目的重新编译) 我想创建它。
这是我的Makefile并试图解决问题
SHELL := /bin/zsh
#All object files are dumped into OBJDIR
OBJDIR=objfiles
OBJECTS=$(OBJDIR)/main.o \
$(OBJDIR)/printdata.o \
#...
#...
COMPILER=nvcc -arch=sm_20
exec: objdir_exist $(OBJECTS)
$(COMPILER) $(OBJECTS) -o exec
@printf "\nExecutable updated!\n\n"
$(OBJDIR)/main.o: main.cu octree.h
$(COMPILER) -c $< -o $@
$(OBJDIR)/printdata.o: printdata.cu
$(COMPILER) -c $< -o $@
...
#Clean-up executables and object files
.PHONY=clean objdir_exist
clean:
rm exec
rm -r $(OBJDIR)
# Check for the existence of object files.
# If it does not exist, then create another object_file directory to dump data to.
# If it exists do nothing
objdir_exist:
if [ ! -d "$(OBJDIR)" ] then mkdir $(OBJDIR) fi
我收到以下错误。
if [ ! -d "objfiles" ] then mkdir objfiles fi
zsh:[:1: ']' expected
nvcc -arch=sm_20 -c main.cu -o objfiles/main.o
Assembler messages:
Fatal error: can't create objfiles/main.o: No such file or directory
make: *** [objfiles/main.o] Error 1
我哪里错了?
答案 0 :(得分:5)
问题是因为当你在一行中写if
时,你应该使用;
作为行分隔符。
所以,替换
if [ ! -d "$(OBJDIR)" ] then mkdir $(OBJDIR) fi
通过
if [ ! -d "$(OBJDIR)" ]; then mkdir $(OBJDIR); fi
答案 1 :(得分:3)
更简单的是:
mkdir -p $(OBJDIR)
答案 2 :(得分:0)
我找到的解决方案就是这样的
BIN=exec
OBJSDIR=objs
all: $(OBJSDIR) $(BIN)
$(OBJSDIR):
if [ ! -d $(OBJSDIR) ]; then mkdir $(OBJSDIR); fi
$(OBJSDIR)/obj1.o: obj1.c header1.h
# $< expands only to first prerequisite
$(COMPILER) -c $< -o $@
$(OBJSDIR)/obj2.o: obj2.c header2.h
$(COMPILER) -c $< -o $@
$(BIN): $(OBJSDIR)/obj1.o $(OBJSDIR)/obj2.o
# $^ expands to all prerequisites
$(COMPILER) $^ -o $@
全部取决于$(OBJSDIR)和$(BIN)。如果$(OBJSDIR)不存在,则会创建它。然后继续检查$(BIN)并构建它,如果它不存在或其先决条件已经改变。