次のメイクファイルがあります
CXX = g++
CXXFLAGS = -c -g -pg -Wall -Wextra
LINK = g++
TARGET = ../../Binaries/tests
SOURCES := ../Src/$(wildcard *.cpp)
OBJS_DIR := ../Objects
OBJS = $(sort $(patsubst %.cpp, $(OBJS_DIR)/%.o, $(patsubst %.c, $(OBJS_DIR)/%.o, $(notdir $(SOURCES)))))
tests: $(TARGET)
$(TARGET): $(OBJS)
$(LINK) $? -o $@
$(OBJS): $(SOURCES)
$(CXX) $(CXXFLAGS) $? -o $@
これを使用してmake tests
(または単にmake
) 実行すると、次の出力が得られます。
g++ -o ../../Binaries/tests
g++: fatal error: no input files
compilation terminated.
make: *** [../../Binaries/tests] Error 4
これは、 make がルールをチェックせずに (まだ存在しない) ファイルをリンクしようとしているように思えます$(OBJS)
。*.cpp
私の目標は、../Src 内のファイルと ../Objects 内のファイル (それが生成するファイル)を見つけることができる、完全に自己完結型の Makefile を持つことですが*.o
、私が書いたルールはそうではありませんそのようにうまくいっているようです。ここでどこが間違っているのか誰か教えてもらえますか?