我有以下Makefile:
CXX = g++
CXXFLAGS = -Wall -g
SOURCES := divisor.cpp multiplier.cpp
OBJECTS := ${SOURCES:.cpp=.o}
%.o: %.cpp
$(CXX) -c $(CXXFLAGS) $< -o $@
%: %.o $(OBJECTS)
$(CXX) $(CXXFLAGS) $@.o -o $@.out
$(OBJECTS): %.o: %.cpp
$(CXX) -c $(CXXFLAGS) $< -o $@
clean:
rm -f *.o
我想要的make文件如下:
如果我将一个名为123.cpp
的源文件添加到工作目录中,我希望它生成其目标文件,然后链接$(SOURCES)
中指定的编译源,这意味着:
g++ -c -Wall -g 123.cpp
g++ multipler.o divisor.o 123.o -o 123
如果必须生成或更新multiplier.cpp
或divisor.cpp
,我想让make来做。
但我失败了,因为divisor.o
和multiplier.o
不是自动生成的
我怎么能实现这个目标?
修改
为了澄清,工作目录中有两种类型的源代码文件:divisor.cpp
,multipler.cpp
是一种类型,而任何其他文件,例如123.cpp
是另一种类型。从某种意义上说,divisor.cpp
和multiplier.cpp
是其他源文件的必备条件。
我希望自动化编译先决条件的过程,并在编译其他文件时链接它们
g++ -c multiplier.cpp
g++ -c divisor.cpp
g++ -c -Wall -g 123.cpp
g++ multipler.o divisor.o 123.o -o 123
答案 0 :(得分:1)
使用wildcard
功能:
SOURCES := $(wildcard *.cpp)
然后,您可以删除“特殊”源文件:
SPECIAL_SOURCES := divisor.cpp multiplier.cpp
SOURCES := $(filter-out $(SPECIAL_SOURCES),$(SOURCES))
更改规则以构建您真正想要的东西:
$(SPECIAL_OBJECTS) := $(SPECIAL_SOURCES:.cpp=.o)
$(BINARIES) := $(patsubst .cpp,,$(SOURCES))
$(SPECIAL_OBJECTS) : %.o : %.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $^
$(BINARIES) : % : %.cpp $(SPECIAL_OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $^