我有以下makefile
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,能够在../Object中找到*.cpp
文件,在../Objects中找到*.o
文件(它将生成itsef),但是我写的规则似乎并没有这样做。谁能告诉我我在哪里出错?
答案 0 :(得分:0)
最有可能的问题出现在以下几行:
SOURCES := ../Src/$(wildcard *.cpp)
应该是这样的:
SOURCES := $(wildcard ../Src/*.cpp)
还可以将源转换为对象,如下所示:
OBJS := $(SOURCES:../Src/%.cpp=$(OBJS_DIR)/%.o)
最后,编译规则通常通过pattern rules实现:
$(OBJS_DIR)/%.o : ../Src/%.cpp
$(CXX) $(CXXFLAGS) $< -o $@