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). 我的目标是拥有一个完全自给自足的 Makefile,能够在 ../Src 中找到*.cpp文件,在 ../Objects中找到*.o文件(它将生成其ef),但是我写的规则没有似乎正在解决这个问题。谁能告诉我这里哪里出错了?

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 回答