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、1 行で記述する場合;、行区切りとして使用する必要があるためです。

だから、交換

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 に答える