2016-06-17 4 views
0

私はMakefileを作成しようとしています。単純なMakefileを実行することはできますが、別のフォルダのファイルをソートする必要はありません。 Makefile、すべての.cと.hファイルを含むsrcフォルダ、変換するファイルを含むファイルフォルダ、すべての.oファイルと実行可能ファイルのbinフォルダが必要です。Cのメイクファイル - ターゲットを作るルールなし

CC = gcc 
CFLAGS = -Wall -Werror -Wextra -pedantic -std=c99 -g 
OBJECTS = word.o pair.o list.o dict.o set.o 

translate : $(OBJECTS) 
    mkdir ./files 
    mkdir ./bin 
    cd ./src; $(CC) $(CFLAGS) -o translate $(OBJECTS) main.c; mv *.o ../bin; mv translate ../bin 

word.o: word.c word.h 
    cd ./src; $(CC) $(CFLAGS) -c word.c -o word.o 

pair.o: pair.c pair.h word.h 
    cd ./src; $(CC) $(CFLAGS) -c pair.c -o pair.o 

list.o: list.c list.h word.h pair.h 
    cd ./src; $(CC) $(CFLAGS) -c list.c -o list.o 

dict.o: dict.c dict.h word.h list.h 
    cd ./src; $(CC) $(CFLAGS) -c dict.c -o dict.o 

set.o: set.c set.h word.h list.h 
    cd ./src; $(CC) $(CFLAGS) -c set.c -o set.o 

.PHONY : clean 

clean : 
    $(RM) ./bin/*.* 
    rmdir ./bin 

しかし、すぐに、私はmakeターミナルショーを入力する:

make: *** No rule to make target `word.c', needed by `word.o'. Stop. 

は、私が以前にJava用のMakefileをこのように作られ、それが働いた

これは私が作ったメイクファイルがあります、確かにsrcフォルダの中にword.hとword.cというファイルがあるので、なぜそれが見つからないのですか?

+0

私はJavaで、今私は正しい方法を使用すると、cdコマンドでさえ、CDを削除した後 –

+0

succesfullのだった知っているように、&&行うことであることを読むことをやりました./srcそれでもword.oを作るためのターゲットファイルが見つからない、私はstandiだと思う間違ったフォルダにあるのですが、どうすればいいでしょうか? –

答えて

3

あなたは(カレントディレクトリ)word.cword.hに依存する、(現在のディレクトリ内)(現在のディレクトリ内)translateword.oに依存することにすると語りました。

確かにsrcフォルダ内にword.hとword.cというファイルがありますが、なぜそれが見つからないのですか?

あなたはsrcを見るように言わなかったので、あなたが何か行うことができ

OBJECTS = word.o pair.o list.o dict.o set.o main.o 
# main.o is also an object file 

bin/translate: $(addprefix bin/,$(OBJECTS)) 
     $(CC) $(CFLAGS) $+ -o [email protected] 

bin/word.o: src/word.c src/word.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 

# ... repeat for all source files 

を(もhttps://www.gnu.org/software/make/manual/html_node/File-Name-Functions.htmlhttps://www.gnu.org/software/make/manual/html_node/Automatic-Variables.htmlを参照してください。)

1

問題は、あなたの行動があなたの依存関係と一致していないということです - あなたはそれを言うのルールを持っていますword.oword.cからビルドしますが、実際にコマンドを実行すると、からsrc/word.oが生成されます。他のルールを見ても、あなたは本当にsrc/word.oがほしいと思わない場合は、bin/word.oが必要です。

ですから、あなたが実際に使用したいファイルの正しい名前とパスを持っているあなたのすべてのルールを修正する必要があります。

OBJECTS = bin/word.o bin/pair.o bin/list.o bin/dict.o bin/set.o 

bin/translate : $(OBJECTS) 
     $(CC) $(CFLAGS) -o [email protected] $(OBJECTS) src/main.c 
bin/word.o: src/word.c src/word.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 
bin/pair.o: src/pair.c src/pair.h src/word.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 
bin/list.o: src/list.c src/list.h src/word.h src/pair.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 
bin/dict.o: src/dict.c src/dict.h src/word.h src/list.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 
bin/set.o: src/set.c src/set.h src/word.h src/list.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 

あなたは、あなたが行動のほとんどがあることをことを見ていたら、同じ、あなたはパターンルールと依存関係を使用できるように:

OBJECTS = bin/word.o bin/pair.o bin/list.o bin/dict.o bin/set.o 

bin/translate : $(OBJECTS) src/main.c 
     $(CC) $(CFLAGS) -o [email protected] $(OBJECTS) src/main.c 
bin/%.o: src/%.c 
     $(CC) $(CFLAGS) -c $< -o [email protected] 
bin/word.o: src/word.h 
bin/pair.o: src/pair.h src/word.h 
bin/list.o: src/list.h src/word.h src/pair.h 
bin/dict.o: src/dict.h src/word.h src/list.h 
bin/set.o: src/set.h src/word.h src/list.h 
関連する問題