【发布时间】:2015-06-09 13:38:38
【问题描述】:
我有以下 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,我想做。
但我失败了,因为 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
【问题讨论】:
-
首先,你没有规则依赖于
$(SOURCES)。您需要与$(OBJECTS)类似的东西 -
您没有根据
$(OBJECTS)指定任何最终目标? -
目标
$(OBJECTS)是否隐含地符合$(SOURCES)的规则?取决于$(OBJECTS)的最终目标不是%:%.o $(OBJECTS)吗?谢谢两位 -
当你说“添加一个名为
123.cpp的源文件”时,你的意思是将该文件放入工作目录,还是以某种方式将“123.cpp”添加到makefile? -
我的意思是“添加一个名为
123.cpp的源文件”我会相应地编辑问题。感谢您的评论