0

我将编译的所有目标文件转储到一个名为 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

我哪里错了?

4

3 回答 3

5

问题在于,当您if在一行中写入时,您应该将;其用作行分隔符。

所以,更换

if [ ! -d "$(OBJDIR)" ] then mkdir $(OBJDIR)  fi

经过

if [ ! -d "$(OBJDIR)" ]; then mkdir $(OBJDIR);  fi
于 2012-09-02T19:27:18.293 回答
3

更简单的是:

mkdir -p $(OBJDIR)
于 2012-09-02T19:32:11.450 回答
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) 并构建它,如果它不存在或者它的先决条件已经改变。

于 2015-04-11T17:34:59.617 回答