C++ 在Makefile中生成对象

C++ 在Makefile中生成对象,c++,makefile,C++,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:

我有以下生成文件:

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
如果必须生成或更新
multiplier.cpp
divisior.cpp
,我想让您这样做

但是我失败了,因为
除数.o
乘数.o
不是自动生成的

我怎样才能做到这一点

编辑

只是澄清一下,工作目录中有两种类型的源代码文件:
divisior.cpp
multipler.cpp
是一种类型,而任何其他文件,比如说,
123.cpp
是另一种类型。从某种意义上说,
divisior.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

使用
通配符
功能:

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 $@ $^

首先,根据
$(源)
,您没有现成的规则。您需要类似于您对
$(对象)
所做的操作您没有根据
$(对象)
指定任何最终目标?目标
$(对象)
是否隐式符合
$(源)
的规则?取决于
$(对象)
的最终目标不是
%:%.o$(对象)
?非常感谢当你说“添加一个名为
123.cpp
”的源文件时,你的意思是将该文件放入工作目录,还是以某种方式将“123.cpp”添加到makefile?我的意思是“添加一个名为
123.cpp
”的源文件,我会相应地编辑这个问题。谢谢你的关注谢谢我正在尽快尝试:)
$(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 $@ $^