0

次のメイクファイルがあります

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、私が書いたルールはそうではありませんそのようにうまくいっているようです。ここでどこが間違っているのか誰か教えてもらえますか?

4

1 に答える 1

0

ほとんどの場合、問題は次の行にあります。

SOURCES   := ../Src/$(wildcard *.cpp)

代わりに、次のようにする必要があります。

SOURCES   := $(wildcard ../Src/*.cpp)

また、ソースをオブジェクトに変換することは、次のように書き直すことができます。

OBJS      := $(SOURCES:../Src/%.cpp=$(OBJS_DIR)/%.o)

最後に、コンパイル ルールは通常、パターン ルールによって実装されます。

$(OBJS_DIR)/%.o : ../Src/%.cpp
    $(CXX) $(CXXFLAGS) $< -o $@
于 2012-04-22T20:22:29.633 に答える