2017-06-26 5 views
0

私はメイクファイルをメイクファイルプロジェクトのサブディレクトリに書き込もうとしています。サブディレクトリにメイクファイル

MyProject \ 
    test.cpp 
    Build\ 
    Makefile 

また、一般的なメイクファイルを作成しようとしています。ビルドがソースと同じディレクトリ内で行われていないので、ターゲットの定義に問題があります。

CC = g++ 
CC_FLAGS = -g3 

EXEC = test 
SOURCEDIR = .. 
SOURCES = $(shell find $(SOURCEDIR) -name '*.c' -o -name '*.cpp') 
OBJECTS = $(addsuffix .o,$(subst ../,,$(SOURCES))) 

.DEFAULT_GOAL = all 

$(EXEC): $(OBJECTS) 
    $(CC) $(OBJECTS) -o $(EXEC) 

%.o: %.cpp 
    $(CC) -c $(CC_FLAGS) $< -o [email protected] 

.PHONY: clean 
clean: 
    rm -f $(EXEC) $(OBJECTS) 

.PHONY: all 
all: $(EXEC) 

は、今私は

make all 
make: *** No rule to make target 'test.cpp.o', needed by 'test'. Stop. 

は誰もこれが機能しない理由を教えたり、より良いアプローチをお勧めすることはできます...私はエラーを取得するビルドするとき。

答えて

1

次のようにオブジェクトからソースへのあなたの依存関係を変更した場合:

%.cpp.o: $(SOURCEDIR)/%.cpp 

動作しているようです。

私は個人的にビルドディレクトリがメイクファイルに抵抗する場合はそうでない場合、完全に削除することができる一時的なディレクトリであることを期待しているので、私はビルドディレクトリで何もしないことをお勧めします。しかし、これは味の問題です。

また、makeプロセスでオブジェクト/ソースとして見つけたすべてのc/cppを使用するのは好ましくありません。あなたのプロジェクトに異種のファイルを追加する必要がある場合は、後でこれらすべてを変更するための悪夢を入力します。

は、さらにヒントとして:通常のオブジェクトは<basename>.oなく<basename>.cpp.o

そしてもう一つ、次のとおりです。 ユーザーがcleanターゲットも実行可能ファイルを削除することを期待しています。そうでない場合は、実行可能ファイルが存在し、すべての依存関係が満たされているため、単にmake clean; makeを実行して再構築することはありません。

関連する問題